【转载】Bash Magic
转载 Bash Magic
2023-09-14 08:59:46 时间
hello
var 无定义时取值 hello 且赋值为 hello
【内部变量】
【字符串截取】
定义字符串
# 号截取,删除左边字符,保留右边字符;
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符;
即删除 http://
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符;
即删除 http://heylinux.com/archives/
%/* 表示从右边开始,删除第一个 / 号及右边的字符;
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符;
其中的 0 表示左边第一个字符开始,5 表示字符的总个数;
其中的 7 表示左边第八个字符开始,一直到结束;
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数;
【字符串替换】
重新定义字符串,方面下面的替换操作
【判断与运算】
数组的实现
字典的实现
# 正确的做法应该是先将命令生成好,然后再通过 eval 执行,如下所示:
linux解决“/bin/bash^M: bad interpreter“ 在执行shell脚本时提示这样的错误主要是由于shell脚本文件是dos格式,即每一行结尾以\r\n来标识,而unix格式的文件行尾则以\n来标识
为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用? 先看这个信息 -bash: XX: command not found 直译过来就是bash找不到相应的命令前文里我们提到这个问题是由于 PATH 设置出错导致我们输入这些常用命令如 ls , cat , vim 等我们之前解决这个问题的方法是 键入 export PATH=/usr/bin.
shell解决/bin/bash^M:bad interpreter:No such file or directory 在执行shell脚本时提示这样的错误主要是由于shell脚本文件是dos格式,即每一行结尾以\r\n来标识,而unix格式的文件行尾则以\n来标识。 查看脚本文件是dos格式还是unix格式的几种办法。
在众多Linux发行版中bash shell 可谓是随处可见。作为众多发行版的首选shell,对于bash shell的学习对我们来说,显得格外重要。
[root@Betty ~]$ echo ${var=hello} hello [root@Betty ~]$ echo ${var:=hello} hello [root@Betty ~]$ echo ${var} hellovar 有定义时取值 $var
[root@Betty ~]$ echo ${var-bye} hellovar 有定义时取值 bye
[root@Betty ~]$ echo ${var+bye} [root@Betty ~]$ echo ${var:+bye} bye
【内部变量】
echo $# # 参数个数 echo $* # 所有参数 echo $@ # 所有参数 echo $? # 上次执行命令返回值 echo $$ # 当前 shell 的进程标识符 /bin/true # 用 将一个命令放到后台执行 echo $! # 最后一个用 后台执行的命令的进程标识符 echo $0 # 当前 shell 脚本的名称 echo $1 # 第一个参数 args=$# # 将 args 赋值为参数个数 echo ${!#} # 最后一个参数 echo ${!args} # 最后一个参数
【字符串截取】
定义字符串
[root@Betty ~]$ var=http://heylinux.com/archives/3668.html显示字符串中的字符数量
[root@Betty ~]$ echo ${#var}
# 号截取,删除左边字符,保留右边字符;
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符;
即删除 http://
[root@Betty ~]$ echo ${var#*//} heylinux.com/archives/3668.html## 号截取,删除左边字符,保留右边字符;
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符;
即删除 http://heylinux.com/archives/
[root@Betty ~]$ echo ${var##*/} .html% 号截取,删除右边字符,保留左边字符;
%/* 表示从右边开始,删除第一个 / 号及右边的字符;
[root@Betty ~]$ echo ${var%/*} http://heylinux.com/archives%% 号截取,删除右边字符,保留左边字符;
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符;
[root@Betty ~]$ echo ${var%%/*} http:从左边第几个字符开始,及字符的个数;
其中的 0 表示左边第一个字符开始,5 表示字符的总个数;
[root@Betty ~]$ echo ${var:0:5} http:从左边第几个字符开始,一直到结束;
其中的 7 表示左边第八个字符开始,一直到结束;
[root@Betty ~]$ echo ${var:7} heylinux.com/archives/3668.html从右边第几个字符开始,及字符的个数;
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数;
[root@Betty ~]$ echo ${var:0-7:3} 68.从右边第几个字符开始,一直到结束;
[root@Betty ~]$ echo ${var:0-7} 68.html
【字符串替换】
重新定义字符串,方面下面的替换操作
[root@Betty ~]$ var=http://heylinux.com/tag1/tag2/tag3/3668.html将字符串中的第一个 tag 替换为 page
[root@Betty ~]$ echo ${var/tag/page} http://heylinux.com/page1/tag2/tag3/3668.html将字符串中的所有 tag 替换为 page
[root@Betty ~]$ echo ${var//tag/page} http://heylinux.com/page1/page2/page3/3668.html将字符串中的第一个 tag 替换为空字符串(即删除)
[root@Betty ~]$ echo ${var/tag} http://heylinux.com/1/tag2/tag3/3668.html将字符串中的所有 tag 替换为空字符串(即删除)
[root@Betty ~]$ echo ${var//tag} http://heylinux.com/1/2/3/3668.html将字符串中的前缀 http 替换为 ftp
[root@Betty ~]$ echo ${var/#http/ftp} ftp://heylinux.com/tag1/tag2/tag3/3668.html将字符串中的后缀 html 替换为 php
[root@Betty ~]$ echo ${var/%html/php} http://heylinux.com/tag1/tag2/tag3/3668.php
【判断与运算】
echo $(date +%Y%m%d).gz # 将命令执行结果作为变量值使用 echo $((4+2*(8-1*6)-4/2)) # 加减乘除混合运算 echo {1..10} # 数字 1 到 10 的 range echo {a..f} # 字母 a 到 f 的 range条件判定
[ $var != "no" ] echo "cool.1" # 脆弱的实现,当 var 无定义时会报告语法错误 [ $num -ne 5 ] echo "yeah.1" # 脆弱的实现,当 num 无定义时会报告语法错误 [ "$var" != "no" ] echo "cool.2" # 健壮的实现,当 var 无定义时仍能进行判断 [[ $var != "no" ]] echo "cool.3" # 健壮的实现,当 var 无定义时仍能进行判断 [[ "$var" != "no" ]] echo "cool.4" # 更健壮的实现,当 var 无定义时仍能进行判断 [[ $num -ne 5 ]] echo "yeah.2" # 健壮的实现,当 num 无定义时仍能进行判断
数组的实现
array=( array_value1 array_value2 array_value3 )动态增加数组元素
array+=(arrary_new1) array+=(arrary_new2) array+=(arrary_new3) echo ${array[*]}数组信息查看
echo ${array[0]} # 数组中第一个值 echo ${array[@]} # 数组中所有值 echo ${array[*]} # 数组中所有值 echo ${#array[*]} # 数组中值个数 echo ${#array[@]} # 数组中值个数
字典的实现
declare -A dict=( ["dict_key1"]="dict_value1" ["dict_key2"]="dict_value2" )字典信息查看
echo ${dict["dict_key1"]} # 字典中第一个值 echo ${dict[@]} # 字典中所有值# 普通赋值操作
a=a+5 echo $a# 算术型赋值操作
let b=b+5 echo $b# 更健壮的算术型赋值操作
let "c += 5" echo $c# 命令生成器,避免变量与语法的混乱
maxnum=100 logfile=/var/log/httpd/access_log awk {print $1} ${logfile} |sort |uniq -c |awk ($1 ${maxnum}){print $2}# 在上面的命令中第二个 awk 的单引号会导致 ${maxnum} 无法被解析为 100 ,从而导致语法错误
# 正确的做法应该是先将命令生成好,然后再通过 eval 执行,如下所示:
command="awk {print \$1} ${logfile} |sort |uniq -c |awk (\$1 ${maxnum}){print \$2}" eval ${command}# 通过变量PIPESTATUS获取管道命令每一层的返回值
lsof | grep access_log | grep -v httpd return_codes=(${PIPESTATUS[*]}) echo ${return_codes[*]}# 通过 while 命令循环按行获取多个参数
while read param1 param2 param3; do echo ${param1} echo ${param2} ${param3} done (echo -e "A B C\n 1 2 3")原文地址:http://ju.outofmemory.cn/entry/181117
linux解决“/bin/bash^M: bad interpreter“ 在执行shell脚本时提示这样的错误主要是由于shell脚本文件是dos格式,即每一行结尾以\r\n来标识,而unix格式的文件行尾则以\n来标识
为什么在“-bash: XX: command not found”下常用命令如“cat”,“ls”变得不可用? 先看这个信息 -bash: XX: command not found 直译过来就是bash找不到相应的命令前文里我们提到这个问题是由于 PATH 设置出错导致我们输入这些常用命令如 ls , cat , vim 等我们之前解决这个问题的方法是 键入 export PATH=/usr/bin.
shell解决/bin/bash^M:bad interpreter:No such file or directory 在执行shell脚本时提示这样的错误主要是由于shell脚本文件是dos格式,即每一行结尾以\r\n来标识,而unix格式的文件行尾则以\n来标识。 查看脚本文件是dos格式还是unix格式的几种办法。
在众多Linux发行版中bash shell 可谓是随处可见。作为众多发行版的首选shell,对于bash shell的学习对我们来说,显得格外重要。
相关文章
- 转载:用Dreamweave cs 5.5+PhoneGap+Jquery Mobile搭建移动开发
- [转载]【基础篇】不为人知的Maya移动坐标轴
- 129、《Android进阶》之第五篇 Fragment 的使用(转载)
- 115、如何构建Android MVVM 应用框架(转载)
- Bash: about .bashrc, .bash_profile, .profile, /etc/profile, etc/bash.bashrc and others
- 转载:工作与人生中应熟练掌握的七个工具
- 转载:唐僧在如来面前吐真言
- 什么是anaconda【转载】
- R中双表操作学习[转载]
- 最短路径-并查集+Floyd[转载]