参考链接:https://blog.csdn.net/hanjinjuan/article/details/119086556

shell 编程—-特殊符号

参数$相关

$? 显示最后命令的退出状态,0表示正常运行退出,其他值为运行出错
$0 脚本本身名称
$1 表示第一个参数
$2 表示第二个参数
$# 表示传递脚本的参数个数
$@ 表示传递脚本的所有参数
$$ 脚本运行的当前进城ID号

括号

小括号()

  • 命令组:括号中的命令新开一个shell 顺序执行命令,括号中的变量不能被剩余脚本使用。括号里命令使用分号;分割,最后一个命令可以没有分号
  • 命令替换:等同于cmd,并非所有shell通用
  • 初始化数组:例如A=(a b cd efg)

    双小括号(())

  • 整数计算:简单的整数运算

  • 支持C语言运算规则的运算符,可以进行进制转换 。 需要深入探究
  • 重定义变量值: a=5;((a++))可将a的值重定义6
  • 算术运算比较:双括号中的变量可以不使用$符号前缀,括号内支持多个表达式用逗号分割

    1. fisher@DESKTOP-PDTE12V:~$ echo $((a=8#55; a+100))
    2. -bash: a=8#55; a+100: syntax error: invalid arithmetic operator (error token is "; a+100")
    3. fisher@DESKTOP-PDTE12V:~$ echo $((a=8#55, a+100))
    4. 145

    中括号[]

    双中括号[[]]

  • [[ 为bash程序语言的关键字,在[[]]所有字符不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换

  • 支持字符串模式匹配。 需要深入探究
  • 使用[[...]]条件判断结构,能够防止脚本中的许多逻辑错误。
  • bash将[[]]的表达式看作一个单独的元素,并返回一个退出状态码

    大括号{}

  • 大括号扩展。对大括号中的文件名作扩展,大括号中不允许未引用或转义的空白;以逗号分割文件列表进行扩展touch {a,b}.txt; 以..分割的顺序文件列表扩展touch {a..d}.txt

  • 代码块。括号内的命令用分号隔开,最后一个命令必须有分号,第一个命令与左括号必须有一个空格。大括号的命令在当前shell执行,相当于匿名函数,脚本变量仍可用。

    数组参数相关

    数组的定义

    Bash Shell 只支持一维数组,初始化无需定义数组大小,下标从0开始

Shell 数组用括号表示,元素用空格分割,语法格式如下:
A=(a b cd efg) //数组的定义
A="a b cd efg" //字符串的定义

数组的使用

遍历数组(for)

  1. //通过元素遍历
  2. for var in ${A[@]}
  3. do
  4. echo ${var}
  5. done
  6. //通过下标遍历
  7. for ((i=0;i<5;i++))
  8. do
  9. echo ${A[$i]}
  10. done
  11. for i in $(seq 0 4) //for i in {0..4}
  12. do
  13. echo ${A[$i]}
  14. done

其他用法

${A[@]} 返回数组的全部元素 ${A[*]}同作用
${#A[@]} 返回数组元素总个数 ${#A[*]}同作用
${A[0]} 返回数组的第一个元素
${#A[3]} 返回数组的第四个元素的长度

shell 编程—-变量

命令替换 $() 和反引号 ```` 比较

作用

均表示命令的替换,将一条命令的执行结果赋给一个变量。反引号或$()里的内容先进行执行,然后将执行的结果代换到当前命令中 ,具体过程为:在shell中fork一个子进程区做他们括起来的命令,然后在返回父进程

区别

bash shell 中使用$(),书写格式易区分,字符未有特殊定义

  • 反引号```与单引号‘’`形式相近,不易区分,适用全部unix shell使用。
  • $()中使用\可特殊字符将转义为普通字符,而 ```本身就对`进行了转义,保留了其本身意思,需要\\转义
  • 在多层次的复合替换中,```必须要额外的转义字符处理`,而$()比较直观。

示例

  1. fisher@DESKTOP-PDTE12V:~$ var=100
  2. fisher@DESKTOP-PDTE12V:~$ echo $(echo \$var $var)
  3. $var 100
  4. fisher@DESKTOP-PDTE12V:~$ echo `echo \$var $var`
  5. 100 100
  6. fisher@DESKTOP-PDTE12V:~$ echo "echo \$var $var"
  7. echo $var 100
  8. fisher@DESKTOP-PDTE12V:~$ echo "$(echo \$var $var)"
  9. $var 100
  10. fisher@DESKTOP-PDTE12V:~$ echo "`echo \$var $var`"
  11. 100 100
  12. fisher@DESKTOP-PDTE12V:~$ echo `echo \\$var $var`
  13. $var 100

变量替换${}

一般情况下,$var${var} 均表示变量的替换,区别不大,但${var}有比较精确的界定变量名称的范围

shell编程—-运算符

单引号''和双引号""区别

单引号厉害之处在于:无论单引号内是特殊字符、变量还是命令,一律按照单引号内的格式内容原封不动的输出,适用于不解析变量、命令等的场景

双引号厉害之处在于:先解析双引号内的变量和命令后输出,适用于字符串中附带有变量和命令并且想将其解析后输出的场景。

建议:字符串常量使用单引号括,字符串中含有变量、命令等使用双引号。

等号===

shell脚本对空格有严格的规定,赋值语句等号两边不能有空格,而字符串比较,等号两边必须有空格

shell编程—-字符颜色

shell 编程—- 文本编辑利器sed\awk\grep