(更新中...)
资料
- Ubuntu官方文档(推荐):
http://manpages.ubuntu.com/manpages/focal/en/man1/bash.1.html - GNU关于bash的官方文档:
https://www.gnu.org/software/bash/manual/html_node/index.html - Advanced Bash-Scripting Guide:
http://tldp.org/LDP/abs/html/
专题
符号
- bash中的括号:
Shell中各种括号的作用详解()、(())、[]、[[]]、{}
Shell 括号总结
Shell脚本中的几个括号总结(小括号/大括号/花括号) - bash中的各种符号:
https://zhuanlan.zhihu.com/p/83338411 - 各种特殊符号的处理:
Linux 下如何处理包含空格和特殊字符的文件名
感叹号(!)
- 用于命令行(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" )) #正确
- 使用=~可以匹配正则表达式,一般放在[[]]中,可避免转义,注意:左右两边必须有空格,且右边不要使用引号,否则会匹配失败
- 参考链接
GNU:Conditional-Constructs
GNU:Bash-Conditional-Expression
if else以及大于、小于、等于逻辑表达式
循环
- for i in
seq start step end
,使用seq(见文中seq部分),可以对整数或浮点数,按一定步长进行循环 - for ((i=0;i<10;i++)),语法同C语言,变量可以不使用'$'符号,但是只能为整数
- for i in list:对list中的各个元素,逐个进行循环,list不限类型,但是如果有空格,会被视为多个变量。
运算
- Shell中的整数expr和浮点数bc运算:
https://www.jianshu.com/p/9651c8e09644 - 利用awk进行计算
#方法一:
#注意重定向的用法
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
字符串
- Shell中的字符串操作(字符串长度、抽取子字符串等):
https://www.jianshu.com/p/72b31ea762e1
命令
(终端查看 command --help,有更多的选项说明)
- Shell调试命令set
set -e:命令执行反正状态不为0时,立即退出
set -x:输出命令执行信息, set +x: 关闭输出命令执行信息
https://www.cnblogs.com/feiyun8616/p/6548658.html - Shell变量(类型)声明declare:
https://www.cnblogs.com/fulucky/p/7927563.html - Shell读取文件到数组:mapfile
# 注意 重定向的用法
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
重定向符号
- 参见mapfile和awk运算的例子
- bash中的重定向(Redirections),GNU官方文档
https://www.gnu.org/software/bash/manual/html_node/Redirections.html#Redirections
Shell语法检查工具
-----------------------------------------------------------
本文来自博客园,作者:小厨房,转载请注明原文链接:https://www.cnblogs.com/erichf/p/13358330.html,否则视为侵权
如有疑问,请站内留言 或加 QQ:②⑨⓪②② ⑦③⑦⑨
-----------------------------------------------------------