(更新中...)

资料

专题

符号

感叹号(!)

  1. 用于命令行(command line)中,作为历史记录(history)的事件引用符(Event Designators)
  • !n:引用第n条历史命令,n为数字
  • !-n:引用倒数第n条历史命令
  • !!:相当于!-1,表示引用上一条历史命令
  • !string:引用最近一条以string开头的历史命令,类似的 !?string?:引用最近一条中间包含string的命令,!?string:引用最近一条以string结尾的历史命令,或者最近一条包含string的命令
  • string1sting2^ 或 \(!!:s/string1/string2/\):将上一条命令中的string1替换为string2。同上一条,可将s/string1/string2/用于任意一条命令之后,进行替换
  • !#:重复命令行中已经有的内容一次
  • 注意:上述所有命令可以出现在命令行中的任意位置
    参考链接

美元符号('$')

冒号(': ')

最近看到一段将urlcode转为正常显示的代码中用到了冒号,代码如下:

#!/bin/bash
urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }
urldecode $1

代码来源自:ubuntu 中文名乱码的解决办法
冒号的用法总结没有找到比较全面的,大致参考:

比较

  • 大于-gt, 小于:-lt,大于等于:-ge, 小于等于:-le, 等于:-eq, 不等于:-ne, 仅适用于\(\color{blue}{整数}\),且中间必须有空格,否则会被整体视为一个字符串,恒为正
a=2
b=1
[[ "$a"-gt"$b" ]]     #返回 1, 因为当成一个整体字符串,非空
[[ "$a"-lt"$b" ]]     #返回 1, 因为当成一个整体字符串,非空

[[ "$a" -gt "$b" ]]   #返回 1,因为 2 > 1
[[ "$a" -lt "$b" ]]   #返回 0,因为 2 > 1

[[ "$a" -lt"$b" ]]   #报错,缺少比较运算符,因为 把$a 和 -lt$b当成了2个字符串
[[ "$a"-lt "$b" ]]   #报错,同上

a=2.2
b=1.1
[[ "$a"-gt"$b" ]]     #返回 1, 因为当成一个整体字符串,非空
[[ "$a"-lt"$b" ]]     #返回 1, 因为当成一个整体字符串,非空

[[ "$a" -gt "$b" ]]   #报错[[: 2.2: syntax error: invalid arithmetic operator (error token is ".2"),因为识别不了2.2为整数
[[ "$a" -lt "$b" ]]   #报错, 同上
  • 在[]和[[]]中,使用 <=, >=,=~时,左右两边不能有空格
[ "$a"\>="$b" ]       #正确
[ "$a" \>= "$b" ]     #错误

[[ "$a">="$b" ]]      #正确
[[ "$a" >= "$b" ]]    #错误
  • 使用 > 和 < 时,左右两边可以存在空格,也可以不使用空格

  • 在[]中比较,①对字符串,仅能使用 == 和 != 比较,== 可以简化为 = , 若使用 > 或 < 表示 字母的ascii码大小 ② 仅可对数字比较时,若使用大于号(>)、小于号(<)等符号,必须对其进行转义

if [ "$a" \> "$b" ]     
  • 使用test进行字符串比较,仅能使用 == 和 != 符号, == 可以简化为 =

  • 在(())中,可以比较两个\(\color{blue}{整数}\)的大小,支持使用大于号(>),大于等于(>=)等符号,不需要使用转义,且变量可以不用'$'符号,不能使用 -gt,-lt等形式

#注意: a,b必须为整数
if (( a > b ))    # 正确
if (( "$a" >= "$b" )) #正确

循环

  • for i in seq start step end,使用seq(见文中seq部分),可以对整数或浮点数,按一定步长进行循环
  • for ((i=0;i<10;i++)),语法同C语言,变量可以不使用'$'符号,但是只能为整数
  • for i in list:对list中的各个元素,逐个进行循环,list不限类型,但是如果有空格,会被视为多个变量。

运算

      #方法一:
      #注意重定向的用法
      a=1.1;b=2.2;echo $(awk '{print($1 + $2)}' <<< "$a $b")

      #方法二
      #注意中间的空格和引号(单引号将awk的内容引用起来,双引号引用的shell中的变量,单引号和双引号之间不能有空格,单引号内部空格随意。对数学计算,双引号内空格随意。)
      a=1.2; b=2.3; echo $(awk 'BEGIN{print('"$a"'+'"$b"');}')

  • let整数运算(变量不需要使用$符号):
      let i++; let i=i+3

字符串

命令

(终端查看 command --help,有更多的选项说明)

     # 注意 重定向的用法
     mapfile -t arr < <(echo "a b"; echo "c d";)
  • seq生成按步长生成数字序列,可以是浮点数:
    用法: seq start step end
for i in $(seq 0.02 0.01 0.1);
do
      echo $i
done

参考链接

重定向符号

Shell语法检查工具