当前位置:   article > 正文

每天学习shell(一)shell指令中的各种括号的作用_shell中各种括号的作用

shell中各种括号的作用

根据经验汇总如下:

1、(()):  用于处理整数的算数、逻辑和关系运算,可用于不同数制转换;可用于if和while和for的条件语句中;【且里面用的运算符,应该是符合C语言语法的运算符】
2、[[]]: 常用于字符串的处理, 支持字符串判空,判不空,字符串比较,字符串模式匹配;


一、小括号
   1、单小括号 ()
   1)命令替换和传输:【这个功能可以同反引号作用一样『``』】

  1. TEST_CASE="FuncTestCase#Test_1"
  2. test_sence=$(echo $TEST_CASE | awk -F # '{print $1}')
  3. echo $test_sence
  4. 得到的结果为:FuncTestCase

   2) 数组初始化   

  1. array=(1, 2, 3, 4, 5)
  2. echo $array
  3.  
  4. 得到的结果为: 1, 2, 3, 4, 5

  2、双小括号 (())
  1)算数运算
  备注1:常用的 + - * /  %  , 均能使用生效;  
  备注2:使用时,变量前可以不使用$符号;
  备注3:常用于 if语句的条件位置; for语句的条件位置等;
  备注4:只能用于整数,不支持浮点数;

  1. case_1: 单纯的数学运算;
  2. a=1
  3. b=2
  4. c=$((a++))
  5. d=$(((a+b)*c/b))
  6. 运行结果:a=1;  b=2;  c=2; d=3
  7. case_2: if 流程控制; 【if 同双括号之间留有空格】
  8. if ((a<b)); then
  9.     echo "111"
  10. else
  11.     echo "222"
  12. 运行结果:111
  13.  
  14. case_3:  循环流程控制:for
  15.  for ((i=0; i<3; i++))
  16.  do
  17.      echo $i
  18.  done
  19.  运行结果:0
  20.          1
  21.          2
  22.          
  23. case_4: 循环流程控制: while
  24.  while ((a<3))
  25.  do
  26.      echo $a
  27.      ((a++))
  28.  done
  29.  运行结果:1
  30.          2

  2)C语言规则运算
 备注1:运行格式为: $((exp)); 
 备注2:所有符合C语音规则的运算符和表达式,均支持;
 备注3:(()) 同let可以互换; 但,同时只能对整数进行运算;

  1. case_1: 逻辑运算 (&&、||)
  2.   if ((a<b && c<b)); then
  3.       echo "111"
  4.   else
  5.       echo "222"
  6.   fi
  7.   运行结果为:2222
  8.   
  9.   if (($a)); then
  10.       echo "a is not null"
  11.   else
  12.       echo "a is null"
  13.   fi
  14.   运行结果:
  15.   当a="" | a=  | a=" " 时, 运行结果均为: a is null
  16.   当a=1 时,运行结果为: a is not null
  17.   备注:a 不能为字符,只能是数字;
  18. case_2: 算数运算 (+ - * / %)
  19. a=1
  20. b=2
  21. c=$((a++))
  22. d=$(((a+b)*c/b))
  23. echo ((b++))
  24. case_3: 关系运算 (> < <= >= == !=)
  25. 备注1: 这里用的关系运算符,只能用C语言支持的;不能用shell的 -eq\-gt等;
  26. a=1
  27. b=2
  28. if ((a==b)); then
  29.     echo "111"
  30. else 
  31.     echo "2222"
  32. fi
  33. 运行结果为: 2222

 3)跨进制运算

  1.  echo $((16#5b))     运行结果为:十进制 91
  2.  echo $((8#57))      运行结果为:十进制 47

二、中括号
  1、单中括号[]  

   【备注】 使用中括号时,可能会有不需要双引号也可以的情况,但是有写不带双引号就会报错, 这种情况下,建议处理串时都带上;
   1)字符串比较  

    【备注1】:[] 支持的字符串比较运算符有: == 、!= 、-z、-n、$;
    【备注2】:[] 应该左右均留空格,运算符左右也留空格,变量应该带有$符号;

  1.    case_1: == (或者 =),检查两个字符串是否相等,相等返回true
  2.      a="hello"
  3.      b="hello_world"
  4.      if [ "$a" == "$b" ]; then
  5.          echo $a
  6.      else
  7.          echo $b
  8. fi
  9.    运行结果:hello_world
  10.    
  11.    case_2: != ,检测两个字符串是否不相等,不相等返回true
  12.      a="hello"
  13.      b="hello_world"
  14.      if [ "$a" != "$b" ]; then
  15.          echo $a
  16.      else
  17.          echo $b
  18. fi
  19.     运行结果: hello
  20. case_3: -z ,检查字符串长度是否为0, 为0返回true
  21.      a="hello"
  22.      if [ -z "$a" ]; then
  23.       echo "111"
  24. else
  25. echo "222"
  26. fi
  27.     运算结果:the length of a is not 0
  28.      
  29.    case_4: -n ,检查字符串长度是否不为0, 不为0返回true [备注,这里的双引号是必须的]
  30.      b=
  31. if [ -n "$b" ]; then
  32.          echo "the length of b is not 0"
  33.      else 
  34.          echo "the length of b is 0"
  35.      fi
  36.     运算结果: the length of b is 0
  37. 或者[不想带双引号,也可以用如下运算]:
  38. b=
  39. if [ ! -z $b ]; then
  40.          echo "the length of b is not 0"
  41.      else 
  42.          echo "the length of b is 0"
  43.      fi
  44.     运算结果: the length of b is 0
  45. case_5: $ ,检查字符串是否为空, 不为空返回true 
  46.      a=
  47.      b=""
  48.      if [ $a ]; then
  49.          echo "a is not null"
  50.      else 
  51.          echo "a is null"
  52.      fi
  53.      
  54.      if [ $b ]; then
  55.          echo "b is not null"
  56.      else 
  57.          echo "b is null"
  58.      fi
  59.   运行结果:a is null
  60.           b is null

2)整数比较

【备注1】:[] 支持的整数比较的运算符,只能是:-eq(等于)、-ne(不等)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于);

  1. case_1: -eq ,检测两个数是否相等,相等为true
  2.      a=3
  3.      b=4
  4.      if [ $a -eq $b ]; then
  5.          echo $a
  6.      else 
  7.          echo $b
  8.      fi
  9.    运行结果为:4
  10.    
  11. case_2: -ne ,检测两个数是否不等, 不等为true
  12.      a=3
  13.      b=4
  14.      if [ $a -ne $b ]; then
  15.          echo $a
  16.      else 
  17.          echo $b
  18.      fi
  19.    运行结果为:3
  20. case_3: -gt ,检测左边数是否大于右边,是为true;
  21.      a=3
  22.      b=4
  23.      if [ $a -gt $b ]; then
  24.          echo $a
  25.      else 
  26.          echo $b
  27.      fi
  28.    运行结果为:4
  29.   
  30.   case_4: -lt ,检测左边数是否小于右边,是为true
  31.      a=3
  32.      b=4
  33.      if [ $a -lt $b ]; then
  34.          echo $a
  35.      else 
  36.          echo $b
  37.      fi
  38.    运行结果为:3
  39. ```
  40.   3)数组索引 
  41. ``` 
  42.      a=("今天" "天气" "怎么样")
  43.      echo $a[1]    输出:今天
  44.      echo $a[2]    输出:天气
  45.      echo $a[3]    输出:怎么样

 2、双中括号 [[]]
  【备注】:[[ ]] 在处理字符串操作上,较[] 有所增强, 主要表现在: 1)支持逻辑运算符&& 和 || ,而不需要使用[] 中的-a 和-o;  2)支持字符串的模式匹配; 3)使用比较运算符时,无需再用转移符号; 4)使用变量,无需加双引号; 5) 使用时,变量前后应该都有空格;
  1)字符串的判空 (-z)

  1. b=""
  2. if [[ -z $b ]]; then
  3. echo "b is null"
  4. else
  5. echo "b is not null"
  6. fi
  7. 运行结果为: b is null

  2)字符串判不空 ( -n)

  1. b=""
  2. if [[ -n $b ]]; then
  3. echo "b is not null"
  4. else
  5. echo "b is null"
  6. 运行结果: b is null
  7. 【备注】在 [] 中判断不空,应该用 『! -z 』,如:
  8. if [ ! -z $b ]; then
  9. echo "the b is not null"
  10. else
  11. echo "the b is null"
  12. fi
  13. 运行结果: the b is null

 【备注】 上述判断使用 -n 和 -z来进行判空和判不空,也可以直接使用变量来判断,比如:

  1. a=
  2. b="hello_world"
  3. if [[ $a && $b ]]; then
  4. echo "11111"
  5. else
  6. echo "22222"
  7. fi
  8. 运行结果: 22222
  9. a="hello"
  10. b="hello_world"
  11. if [[ $a && $b ]]; then
  12. echo "11111"
  13. else
  14. echo "22222"
  15. fi
  16. 运行结果为: 11111

   3)字符串比较 (等于==,不等于!=,> 和 < )

  1. a="hello"
  2. b="hello_world"
  3. if [[ $a == $b ]]; then
  4. echo "111"
  5. else
  6. echo "2222"
  7. fi
  8. 运行结果:2222
  9. if [[ $a != $b ]]; then
  10. echo "111"
  11. else
  12. echo "2222"
  13. fi
  14. 运行结果:111
  15. 【备注】对于字符串使用比较运算符做比较,本质上是比较的每个字符的ASCII码值;
  16. a="hello"
  17. b="world"
  18. if [[ $a > $b ]]; then
  19. echo "1111"
  20. else
  21. echo "2222"
  22. fi
  23. 运行结果为:2222

  4)逻辑运算 (&& 和 || )

  1. a="hello"
  2. b=
  3. if [[ $a && $b ]]; then
  4. echo "111"
  5. else
  6. echo "222"
  7. fi
  8. 运行结果为: 222
  9. if [[ $a || $b ]]; then
  10. echo "111"
  11. else
  12. echo "222"
  13. fi
  14. 运行结果为:111

  5)字符串模式匹配  (=~  和 ==)

  1. 【备注1】:== 的匹配 要求符合右边不能加双引号;即:不带双引号表示一种模式匹配; 带上双引号表示字符串比较;
  2. 【备注2】:如果是模式匹配,* 表示匹配任意个数的字符; ? 表示匹配任意一个字符;
  3. case_1:
  4. a="PerformMemoryCPUTestCase"
  5. if [[ $a == Perform* ]]; then
  6. echo "this is a perform test"
  7. else
  8. echo "other"
  9. fi
  10. 运行结果: this is a perform test
  11. case_2
  12. a="PerformMemoryCPUTestCase"
  13. if [[ $a == "Perform*" ]]; then
  14. echo "this is a perform test"
  15. else
  16. echo "other"
  17. fi
  18. 运行结果: other
  1. 【备注1】: =~ 是shell的一种双目运算符,左侧为一个字符串或者字符串变量; 右侧为一个模式; 整个运算用于判断左侧的字符串是否匹配到右侧的模式,如果匹配,返回1,否则返回0
  2. case_1: 字符串匹配
  3. a="PerformMemoryCPUTestCase"
  4. if [[ $a =~ Perform* ]]; then
  5. echo "this is a perorm test"
  6. else
  7. echo "other"
  8. fi
  9. case_2: 判断子串 [b是a的子串]
  10. a="hello_world_everyone"
  11. b="world"
  12. if [[ $a =~ $b ]]; then
  13. echo "111"
  14. else
  15. echo "222"
  16. fi
  17. case_3: 判断是否是ip地址的格式;
  18. a=192.29.229.29
  19. if [[ $a =~ ^([0-9]{1,3}.){3}[0-9]{1,3}$ ]]; then
  20. echo "111"
  21. else
  22. echo "222"
  23. fi

三、大括号
 1)字符串提取和替换  

  1. 提取:
  2. a="PerformMemoryCPUTestCase"
  3. echo ${a:4} 运行结果:ormMemoryCPUTestCase 【从第四个开始到结尾】
  4. echo ${a:4-7} 运行结果:ase 【从4-7=-3,即倒数第三个开始,到结尾】
  5. echo ${a:(-4)} 运行结果:Case 【从倒数第四个开始,到结尾】
  6. echo ${a:(-4)-(-7)} 运行结果:formMemoryCPUTestCase 【从 第三个开始,到结尾】
  7. echo ${a:(-4):5} 运行结果:Case 【从倒数第四个开始,输出5个字符】
  8. echo ${a:4:6} 运行结果: ormMem 【从第四个开始,输出6个字符】
  1. 替换: ${var/partten1/partten2} [将var中,第一次匹配到partten1模式的内容替换成partten2]
  2. ${var//partten1/partten2} [将var中,所有匹配到partten1模式的内容替换成partten2]
  3. a=/file_1/case_1
  4. echo ${a/1/2} 运行结果为:/file_2/case_1
  5. echo ${a/1/3} 运行结果为:/file_3/case_1
  6. echo ${a//[0-9]/4} 运行结果为:/file_4/case_4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/154373?site
推荐阅读
相关标签
  

闽ICP备14008679号