Pages

Thursday, 21 December 2017

Bash符号用途的小结


$ 调用变量

  • 调用变量,一般$var即可,和字符连接时最好用${var}
  • 在正则表达式中被定义为行末
  • 特殊变量.例如下面的
  • $n n是整数,参数变量(像脚本输入选项)和函数参数的调用
  • $* 所有参数变量,"$*"是一个字符串
  • $@ 所有参数变量,"$@"还是逐个逐个的返回变量
  • $? 上次命令运行的返回值
  • $$ 进程ID变量,这个变量保存了运行当前脚本的进程ID值。

! 非,历史操作

  • [ ! -z $a ]判断表达式中的否逻辑
  • !(*.pdf) 匹配内容外的其余内容,这里是非pdf文件
  • [!123] 表示非指定字符外的任意单字符
  • != 字符串不等于.
  • bang命令,操作历史命令,不能用于脚本!只能在命令行使用. 更多请参考Ref7.
    • !grep 执行最近执行的开头匹配的命令
    • !n n为数字,执行历史编号(history)第n的命令
    • !-n 执行之前第几条命令,!-1等于!!
    • !!执行上一条命令
    • !?command? 执行回检最近的符合的指令.完全匹配可以忽略最后的?.
    • !!:s/a/b/将上条命令的a变为b(一次)
    • !!:gs/a/b/将上条命令的a变为b(全部)
    • ^a^b 将上一条命令的a变为b,等价于!!:s/a/b/
    • ^a 删掉上一命令的a
    • !# 重复当前命令的前面部分.如ls ~ !#等价于ls ~ ls ~ (有何用?)

& 背景,and

  • 加在命令最后,表示背景运行
  • [[ ]]&&表与and操作.
  • 在命令后面的&&表示当前面命令返回正确时则执行后面的命令

{} 变量名,逐个扩展,代码块

  • 变量名调用时定义变量名
  • 大括号扩展,逐一输出组合情况.如a-{a,b,c}会输出aa ab ac.大括号内不许留空格,除非在字符串内或转义.
  • 字符列表扩展,{a..h}会逐一输出这些字符,只支持a-z,A-Z,0-9这样.大括号内不允许留空格.其实是特殊的大括号扩展.bash3后引进.
  • function中的代码块

[] 判断运算,数组号,指定单匹配

  • [ ] 判断表达式,\<\>需要转义
  • [[ ]] 带有模式匹配的判断表达式,<>不需转移,支持&& ||逻辑操作,变量可不需要$.
  • array[n] 调用数组元素
  • [!123]和[a-h]中表示任一匹配的单字符
  • $[3+7]将运算结果返回

() 运算,调用

  • 优先运算
  • array=(1 2 3)定义数组
  • ((1+2))数值计算,可以作为判断条件,非0时为真.注意不返回计算结果.
  • a=$(date) 直接调用函数并运行,将结果像变量一样返回.类似于` `
  • a=$((3+7))输出运算结果并返回

* 通配,乘

  • 任意数量字符的通配符
  • *乘法和**乘方(expr中不支持乘方,乘法也要转义)
  • "$*"表示将所有参数变量作为一个字符串返回
  • 正则表达式中可以作为字符限定符,表示其前面的匹配规则匹配任意次.

? 匹配

  • 单字符通配符
  • $?上次指令的返回值.0为正常返回.
  • 正则表达式中,表示匹配其前面规则0次或者1次

. 目录

  • ...代表当前和上级目录
  • . hello.sh 相当于source命令,当前shell加载脚本
  • .avi linux隐藏文件前缀
  • 正则表达式中,点号表示任意一个字符。

" " 字符串

  • 字符串,$会起效,用来表达' '

' ' 字符串

  • 字符串,但$变量化失效,但转义起效.还用在可以用来表达"".

` ` 执行

  • 执行里面的指令.

| 管道

  • 管道,将上一命令的结果用作下一命令的输入
  • [[ ]]||表或操作.
  • 在命令后面的||表示当前面命令返回否时则执行后面的命令

> 重定向,大于

  • 重定向输出stdout,>存在则覆盖,>>追加
  • 1>2>,前者stdout,后者stderr.2>&1错误重定向到stdout文件
  • 大于,在[]中要转义,[[]]中不需要

< 重定向,小于

  • 重定向输入
  • 小于,在[]中要转义,[[]]中不需要

@ 表示逐一

  • $@表示所有参数变量,即使加了""依然逐个处理.
  • ${@:3} 同上,指第三参数开始所有参数变量

# 注释,左起匹配

  • 注释
  • ${#var} 中表返回长度数量,${#array[*]} 数组元素数量
  • ${字串#匹配字串}左起匹配的最短字符串(支持*等)的删去,像/home/hi/abc.txt${var#*/}home/hi/abc.txt
  • ${字串##匹配字串} 左起匹配的最长字符串(支持*等)的删去,上例,${var##*/}abc.txt
  • ${变量1/#查找字符/替换字符}左起匹配的替换,可以不输入#也行

% 求余,右起匹配

  • 求余运算5%1
  • ${字串%匹配字串} 右起匹配的最短字符串(支持*等)的删去,像/home/hi/abc.txt${var%.*}/home/hi/abc
  • ${字串%匹配字串} 右起匹配的最长字符串(支持*等)的删去,像/home/hi.ok/abc.txt${var%%.*}/home/hi
  • ${变量1/%查找字符/替换字符}右起匹配的替换

/ 表示分隔,除法,替换

  • linux/mac下目录符
  • 数学运算中的除法
  • ${变量1/查找字符/替换字符}或sed等正则式中表示分隔.
  • ${变量1//查找字符/替换字符} 将所有查找到的字符替换为替换字符串

\ 转义

  • 转义符,例如\n\t输出换行和tab,\\输出\.
  • 在行末使用\可以转义换行符,从而使下一行相当于续行.

~特殊目录

  • 相对路径中表示用户目录
  • ~+ 当前目录,相当于pwd
  • ~- 上次所在目录,相当于-

^ 正则行首符

  • 在正则表达式中,行首位置标志符;
  • ^a^b 将上一条命令的a变为b,bang命令
  • ^a 删掉上一命令的a,bang命令
  • bash4后,${var^},${var^^}表示首字符大写和全部大写.不建议使用

; 语句终结和分隔

  • 同一行多个语句分隔符
  • ;;case语句选项的终结符

,

  • 在表达式中前后均执行,但只返回最后一句.如let k=((a=3,b=4))
  • 在bash4以后,${a,},${a,,}表示首字符小写和全部小写.不推荐使用.

+ 加号

  • 数学运算的加法
  • 在正则表达式中,表示的是其前的这个匹配规则匹配最少一次;

- 相减,参数选项,范围

  • 数学运算的减法
  • -l --help 命令选项
  • 相对路径中表示上一次所在的目录
  • [a-h]中表示范围.
  • [ -f abc.txt ]在判断表达式中控制选项,数学比较-eq,-nq,逻辑-o,-a等.

= 赋值或相等

  • a=1 变量赋值
  • [ a = b ] 字符串相等比较,==等价.

: 表示位置,空命令

  • ${var:3}表示第四个字符起的字符串(因为从0起),支持负数表达反向
  • ${var:开始位置:结束位置} 某个范围内字符串.不支持负数
  • ${@:3}中表示第三个起以后的项
  • 总返回0的空命令,可替代true用于while循环,也可用于空语句块避免语法错误.
  • unix系统的域分界符,如PATH变量分开每个值.

懒得总结快捷键了,请参考Ref8好了. ╮(╯▽╰)╭

Reference

  1. Shell中比较判断,控制,循环和函数
  2. Shell变量,数组,运算及操作
  3. 正则表达式
  4. Advanced Bash-Scripting Guide
  5. IBM-对话 UNIX:!$#@*%
  6. Linux下高效编写Shell——shell特殊字符汇总
  7. 感叹号提高Bash下效率——历史扩展(bang命令)
  8. Linux下更高效的使用Bash——快捷键

No comments:

Post a Comment