1. 单小括号()
I. 命令替换,等同于`command
`
echo $(ls)
echo `ls`
II. 子shell命令组合(command1; command2; [command3..])
(ls; pwd;)
III. 初始化数组
array=(a b c d)
declare -a array='([0]="a" [1]="b" [2]="c" [3]="d")'
2. 双小括号 (( ))
I. 数值运算
只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中
echo $((16#5f))
II. 算数比较
双括号中的变量可以不使用
$
符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C
语言运算规则,比如可以直接使用for((i=0;i<5;i++))
, 如果不使用双括号, 则为for i in
`seq 0 4
`或者for i in {0..4}
。再如可以直接使用if (($i<5))
, 如果不使用双括号, 则为if [ $i -lt 5 ]
#求100以内的偶数
#! /bin/bash
num=2
while ((num<100)) #数值与运算符可以没有空格,变量的使用时也可以不使用$num
do
echo "$num"
((num=num*2))
done
- 循环中的自加,变量间的运算都可以使用
(())
3. 单中括号[ ]
I. 件属性测试
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ]返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于 0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
fpath="/etc/passwd"
if [ -e $fpath ]; then
echo File exits;
else
echo Does not exit;
fi
II. 算数比较
Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式
[ $var1 -ne 0 -a $var2 -gt 2 ] # 使用逻辑与 -a
[ $var -eq 0 ] # 当 $var 等于 0 时,返回真
if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。
III. 字符范围。用作正则表达式的一部分,描述一个匹配的字符范围
cat 1.txt |grep [a-zA-Z]
IV. 数组元素引用
echo ${array[0]}
echo ${array[@]}
4. 双中括号
I. 字符串比较
[[ ]]
结构比[ ]
结构更加通用,其中的所有字符都不会发生文件名扩展或单词分割的问题,并且在其中可以使用通配符,比如[[ hello == hell? ]]
,结果为真。[[ ]]
中匹配字符串或通配符,不需要引号
if [[ $a != 1 && $a != 2 ]]
if [[ hello == hell? ]]
操作符 | 意义 |
---|---|
[[ $str1 != $str2 ]] | 如果 str1 与 str2 不相同,则返回真 |
[[ -z $str1 ]] | 如果 str1 是空字符串,则返回真 |
[[ -n $str1 ]] | 如果 str1 是非空字符串,则返回真 |
II. 避免逻辑错误
使用
[[ ... ]]
条件判断结构,而不是[ ... ]
,能够防止脚本中的许多逻辑错误,&&、||、<和>
操作符能够正常存在于[[ ]]
条件判断结构中,但是如果出现在[ ]
结构中的话,会报错
if [[ $a != 1 && $a != 2 ]]
5. 大括号
I. 大括号扩展
- 第一种:对大括号中的以逗号分割的文件列表进行拓展。
- 第二种:对大括号中以
(..)
分割的顺序文件列表起拓展作用
# ls {ex1,ex2}.sh
ex1.sh ex2.sh
# ls {ex{1..3},ex4}.sh
ex1.sh ex2.sh ex3.sh ex4.sh
# ls {ex[1-3],ex4}.sh
ex1.sh ex2.sh ex3.sh ex4.sh
II. 字符串提取和替换${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
III. 字符大小写转换
${var^^}:把var中的所有小写字母转换为大写
${var,,}:把var中的所有大写字母转换为
IV. 命令组合
{ cmd1;cmd2;cmd3;}