手记

Shell 括号总结

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;} 
1人推荐
随时随地看视频
慕课网APP