参考文档
Linux 基础语法
注意点
- sh 与 bash 的区别一定要注意,通常linux发布版本都支持bash版本,但是部分系统默认只安装了sh,所以在使用时一定要区分(如alpine)
- sh 是shell的初始版本,bash是为了兼容sh同时兼容POSIX而开发的版本,之后的linux版本通常都为sh做了外链到bash上
- 在重定向时,bash是先创建文件然后再执行命令
- su 如果没有指定 - ,则为非登陆bash(不会执行登录用户加载的profile和.bashrc等脚本)
- 命令替换在命令发生前进行
- source 与 sh执行的区别在于: source 在当前bash中执行,而sh则在子bash中执行脚本,方法与变量对当前bash不造成影响
小括号概念
- 定义数组的方式(sh不支持)
arr=(100 200 300 400)
echo ${arr[*]} #显示所有数组元素
echo ${arr[@]} #同上
echo ${#arr[*]} #显示数组或者数组元素的长度
arr[0]=500 #给数组第一个元素赋值
c=(${arr[*]:1:2}) #从第一个元素开始取两个元素,必须包含括号,否则就不是数组
unset arr[2] #删除第三个元素,但是其他元素位置不变,如果希望得到一个重新序列数组,则arr=(${arr[*]})
arr+=( 500 ) #追加一个新的元素
- 执行命令
$(echo nihao) #将标准输出赋值给变量a
(a=b ; c=d ;echo $a$c) #打开一个子bash执行,变量将不会被父级理解,但可以引用父级变量
双小括号
- 数学运算,不支持浮点型
((n=5,i=n,i++)) #可以支持多个运算,可以省略$变量符号
var=$((n++)) #进行运算后赋值
((i<5)) || echo no #如果不小于5则 输出no,说明作为一个标准输出执行
echo $((8#11)) #11的格式是8进制,转成10进制后为9
单中括号
作为判断使用前注意前后保持一个空格
- 字符比较实用“== !=”,数学比较 “-eq -gt”,< > 符号必须转义才能使用,中括号与test 功能等同
- 多条件判断时使用: -a -o
- 在array中中括号表示数组中的一个元素
[ 1 -eq 1 -a 1 == 2 ] && echo yes # 多条件判断
双中括号
作为判断使用前注意前后保持一个空格
- 括号内的表达式看做一个单独的元素,退出后返回一个状态
- 多条件判断时使用:&& ||
- 支持正则表达式而不需要引号 (sh不支持)
[[ a == b && c == c ]] || echo '不等于'
[[ 123 =~ [:alnum:] ]] || echo '不等于'
花括号(sh不支持)
mkdir -p {ex3,ex4}.sh #大括号文件名扩展
{ a=35;b=30;((a+=b));} #与小括号类似,但是不生成子bash,余下脚本可以引用内部变量;左边需要留空格,最后需要加冒号
- 变量检查
test ${ab:-value} == value #通常判断ab是否定义来决定后面的操作
: ${ab:=abc} #通常给变量赋默认值
test ${ab:+abc} == abc #与- 功能相反
test ${ab:?does not exists} #如果没有定义ab变量则将问号后面的字符作为错误输出并退出bash
- 变量匹配截断与替换
a=abcdcefab #以下均不改变变量本身
echo ${a%c*b} #结果为abcd,从右边开始最短匹配,如果满足则删除
echo ${a%%c*b} #结果为ab,从右边开始最长匹配,满足结果则删除
echo ${a#a*c} #结果为dcefab,从左边开始最短匹配,如果满足则删除
echo ${a##a*c} #结果为efab,从左边开始最长匹配,如果慢则则删除
arr=(100 200 300)
echo ${arr[@]/100/bbb} #将含有100的元素用bbb字符串来替换
echo ${arr[@]//100/bbb} #将所有100的元素用bbb字符串来替换
bash中的特殊变量
- 特殊字符
^ #字符开头
$ #字符结尾
&& #前面条件成立则执行后面的命令
|| #前面条件失败则执行后面的命令
#! #执行脚本的默认脚本
\ #逃逸字符
'' #逃逸字符
< #将右边文件输入到左边
> #将左边输出到右边文件,如果不存在则创建
>> #追加到右边的文件
<< #将字符输入到左边
`` #与$()相同
!! #上一个命令
.* #代表任意字符
| #管道符号,或者是或
- 系统变量
$_ #返回上一个命令的最后一个参数
$@ #所有双引号内的参数算一个
$* #所有参数算一个
$# #参数的数量,引号内的参数算一个
$? #前一条命令返回的结果
$! #后台命令的进程ID
$PPID #父进程ID
$$ #当前bash进程ID
$UID #用户ID
$USER #当前用户
$BASH_VERSION #bash版本号
$HOSTNAME #主机名
$OLDPWD #上次目录
$PWD #当前目录
$RANDOM #返回0-32767中的一个数字
$SECONDS #bash运行的时长
$HISTFILE #用户历史命令路径
$HISTSIZE #用户历史命令最大记录条数