此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:
①、命令组:
格式:(cmd1;cmd2;cmd3...) —— 将多个命令用 () 括起来,组成一个命令组!
注意:括号中的命令会新打开一个子shell进程去执行!
★ 1、括号中的变量问题;()中的变量不能被脚本中的其他部分使用!
★ 2、如果需要在脚本中执行 exit 命令,也不能在()中执行,因为他关闭的是()中打开的子shell!
★ 3、cmd 之间使用;隔开,最后一个命令结尾不需要跟分号(;)
★ 4、() 与 cmd 之间 不需要有空格!
②、命令替换:
格式: $(cmd) ;$(cmd) = $`cmd`
shell 扫描一遍命令行,发现了 $(cmd);然后先执行一遍$(cmd) 中的 cmd;
然后将执行后的标准输出结果,放进 $()中!
eg:
root@zhengzelin:~# for i in $(seq 0 4);do echo $i;done
0
1
2
3
4
# tcsh shell 不支持命令替换功能!
③、初始化数组:
顾名思义,将数组初始化!
eg: array =(a b c d)
1、算术运算符:+ - * / % (必须结合命令 expr来实现)
2、整数运算符: 无
3、字符串运算符:无
4、逻辑运算符:无
5、文件运算符:无
root@zhengzelin:~# a=$(expr "1" + "2" );echo $a
3
①、整数运算:
这个在 shell 中实现运算中提到过:
eg:
root@zhengzelin:~# a=$((1+2)) | echo $a
3
注意: 只支持整数运算!
②、重定义变量值:
root@zhengzelin:~# a=1;((a++));echo $a
2
③、((expr)):
要求是: (( )) 中的表达式(expr) 或 运算符 满足 C语言运算规则!
1、算术运算符:+ - * / %
2、整数运算符: == 、!= 、> 、>= 、< 、<=
3、字符串运算符:= (比较两个字符串是否相等)
4、逻辑运算符:& && | ||
5、文件运算符:无!(不可使用)
"算术运算:"
root@zhengzelin:~# a=$(( 1 * 2 ));echo $a
2
"整数运算:"
root@zhengzelin:~# (( 1 != 2 ));echo $?
0
"逻辑测试:"
root@zhengzelin:~# (( 1 > 2 && 1<2 ));echo $?
1
root@zhengzelin:~# (( 1 > 2 & 1<2 ));echo $?
1
root@zhengzelin:~# (( 1 > 2 | 1<2 ));echo $?
0
root@zhengzelin:~# (( 1 > 2 || 1<2 ));echo $?
0
"字符串运算:"
root@zhengzelin:~# (( abc == ade ));echo $?
1
"文件测试运算:"
无,不可使用
①、与 test 命令(条件测试)等同:
test 用来判断 后面的表达式是否成立! 当然 [ ] 也可以实现这种功能
关于 test 及 test 中的运算符 的更多介绍:https://blog.csdn.net/ljlfather/article/details/105156700(自己写的)
root@zhengzelin:~# a=abc,b=def
root@zhengzelin:~# test $a = $b;echo $?
1
root@zhengzelin:~# [ $a = $b ];echo $?
1
②、不支持算术运算…
不支持: + - * / %
③、支持字符串比较…
④、支持逻辑测试…
⑤、字符范围…
用做正则表达式中,表示:匹配的字符范围!
正则表达式: [ ] :指定范围内的任意单个字符:[0-9]、[a-z]....
[^ ]:匹配不包含 "[ ] 范围里的字符" 的字符!
当 [ ] 用来表示 test条件测试的时候,不可以使用正则表达式!
⑥、引用数组元素编号(下标)…
在一个 数组结构 的上下文中,[ ] 用来引用数组中每个元素的编号!
array[10] : 这是一个含有十个元素的数组,数组名为 array;
每个元素为: array[0]、array[1]....array[9]
1、算术运算符: + - * / %
2、整数运算符: ==(-eq)、!=(-ne)、\>(-gt)、\<(-lt)、-ge 、 -le
3、字符串运算符:=(==)、-z (空字符串)、-n(非空字符串)
4、逻辑运算符: -a(双方为true) 、 -o(单方为true)、!(取反)
5、文件运算符:-d(目录)、-f(普通文件)、-b(块设备文件)、-c(字符设备文件)…
"算术运算:"
root@zhengzelin:~# a=$[1+2];echo $a
3
# 有时候使用 *(乘) 的时候注意给 * 转义,因为 [ ] 是bash内部命令。
"整数运算:"
root@zhengzelin:~# [ 1 -le 2 ];echo $?
0
root@zhengzelin:~# [ 1 \< 2 ];echo $?
0
"字符串运算:"
root@zhengzelin:~# [ abc == abc ];echo $?
0
root@zhengzelin:~# [ abc = abc ];echo $?
0
"逻辑运算符:"
root@zhengzelin:~# [ 1 \> 2 -a 1 \< 2 ];echo $?
1
root@zhengzelin:~# [ 1 \> 2 -o 1 \< 2 ];echo $?
0
root@zhengzelin:~# [ ! 1 == 2 ];echo $?
0
"目录或文件测试符:"
root@zhengzelin:~# [ -d /root ];echo $?
0
root@zhengzelin:~# [ -f /root ];echo $?
1
①、 字符串比较…
用 运算符 左边的字符串 来跟 右边的字符串 进行比较;右边的字符串 不仅仅是字符串,也可以使用 通配符!!!
root@zhengzelin:~# [[ hello == hell? ]];echo $?
0
root@zhengzelin:~# [[ helloabd == hell* ]];echo $?
0
使用通配符匹配字符串,而非正则表达式!!!
通配符 :?:任意单个字符
* :任意长度任意字符
[[ ]] 中使用 表达式 或 通配符 不需要使用 “ ” 括起来!
②、Bash 程序语言的关键字,并不是命令…
比 [ ] 更加的通用 !!!
1、算术运算符: 不支持
2、整数运算符: ==(-eq)、!=(-ne)、>(-gt)、<(-lt)、-ge 、 -le
3、字符串运算符:==(=)、-z (空字符串)、-n(非空字符串)
4、逻辑运算符: &&(双方为true) 、 ||(单方为true)、!(取反)
5、文件运算符:-d(目录)、-f(普通文件)、-b(块设备文件)、-c(字符设备文件)…
"算术运算:" 不支持
"整数运算:" 基本上与 [] 一样,区别: [[ ]] 中使用 > < 不需要转义:
root@zhengzelin:~# [[ 1 == 2 ]];echo $?
1
root@zhengzelin:~# [[ 1 -eq 2 ]];echo $?
1
root@zhengzelin:~# [[ 1 > 2 ]];echo $?
1
root@zhengzelin:~# [ 1 > 2 ];echo $?
0 # [ ] 中必须转义!
"字符串运算:" 与 [ ] 中一样:
root@zhengzelin:~# [[ -z abc ]];echo $?
1
root@zhengzelin:~# [[ -n abc ]];echo $?
0
root@zhengzelin:~# [[ abc = abcd ]];echo $?
1
root@zhengzelin:~# [[ abc == abcd ]];echo $?
1
"逻辑运算:" # 只支持 && 、 || 、!
root@zhengzelin:~# [[ abc = abc && 1 > 2 ]];echo $?
1
root@zhengzelin:~# [[ abc = abc || 1 > 2 ]];echo $?
0
root@zhengzelin:~# [[ ! a == b ]];echo $?
0
"文件或目录运算:" # 与 [ ]一样!
root@zhengzelin:~# if [[ -d /root ]];then echo "cunzai";else echo "no";fi
cunzai
root@zhengzelin:~# if [[ -d /root/aaa ]];then echo "cunzai";else echo "no";fi
no
# 因为 /root/aaa 是文件,你得使用 -f 或者 -a、-e ,-d 是测试目录!
root@zhengzelin:~# if [[ -a /root/aaa ]];then echo "cunzai";else echo "no";fi
cunzai
root@zhengzelin:~# if [[ -e /root/aaa ]];then echo "cunzai";else echo "no";fi
cunzai
root@zhengzelin:~# if [[ -f /root/aaa ]];then echo "cunzai";else echo "no";fi
cunzai
①、命令组:
说到命令组很熟悉吧?因为上面的 ( ) 也可以用做命令组!
不过 他们两个可是有很大区别的!
格式上: (cmd1;cmd2) 对比 { cmd1;cmd2;}
# () 开头不需要空格隔开,结尾不需要使用; ,然而 { } 都需要!
进程方面: ( ) 会打开一个子shell 执行( ) 中的命令;而 { } 在当前shell执行{ } 中的命令!
# 如果你想使用 exit来退出当前shell,你应该使用 { }命令组,而不是( ),( )中的exit只会退出子shell!
变量方面: ( ) 中的变量,在脚本中的其他部分不能使用!因为是子shell中的变量!
然鹅,{ } 中的变量,脚本的其他部分也可以使用 !!!
②、范围(合集)…
第一种:
# 对 { } 中 以“,”分割的文件列表进行扩展...
root@zhengzelin:~# touch {a,c}.txt | ls *.txt
a.txt b.txt c.txt
第二种:
# 对 { } 中 以“..”分割的文件列表进行扩展...
root@zhengzelin:~# touch {a..d}.sh
root@zhengzelin:~# ls
a.sh b.sh c.sh d.sh
关于 函数方面的 { } 的使用,请参考此文章:
https://blog.csdn.net/taiyang1987912/article/details/39551385