shopt支持的bash选项含义
使用shopt -p可以列出所有的bash选项以及开关状态.
nocasematch
bash在case结构的样式对比时忽略大小写的开关.
1 2 3 |
case 待测项 in 样式) 命令执行;; esac |
nounset
打开该选项的情况下,所有变量要先声明才能被使用.
cdable_vars
如果给cd内置命令的参数不是一个目录,就假设它是一个变量名,变量的值是将要转换到的目录
cdspell
纠正cd命令中目录名的较小拼写错误。检查的错误包括颠倒顺序的字符,遗漏的字符以及重复的字符。如果知道一处修改,正确的路径就打印出,命令将继续。只用于交互式shell
checkhash
bash在试图执行一个命令前,先在哈希表中寻找,以确定命令是否存在。如果命令不存在,就执行正常路径搜索
checkwinsize
bash在每个命令后检查窗口大小,如果有必要,就更新LINES和COLUMNS的值
cmdhist
bash试图将一个多行命令的所有行保存在同一个历史项中。这使得多行命令的重新编辑更方便
dotglob
bash在文件名扩展的结果中包括以点(.)开头的文件名
execfail
如果一个交互式shell不能执行指定给exec内置命令作为参数的文件,它不会退出。如果exec失败,一个交互式shell不会退出
expand_aliases
别名被扩展。默认为打开
extglob
打开扩展的模式匹配特征(正常的表达式元字符来自Korn shell的文件名扩展)
bash对case结构中使用高级样式的支持的开关.高级样式的详细用法在case命令.
histappend
当shell退出时,历史清单将添加到以HISTFILE变量的值命名的文件中,而不是覆盖文件
histreedit
如果readline正被使用,用户有机会重新编辑一个失败的历史替换
histverify
如果设置,且readline正被使用,历史替换的结果不会立即传递给shell解析器。而是将结果行装入readline编辑缓冲区中,允许进一步修改.
该变量与历史执行扩展后的结果是否立即执行有关.选项关闭时扩展的结果会被立即执行,如果打开会将扩展结果显示在命令行以供编辑.
hostcomplete
如果设置,且readine正被使用,当正在完成一个包含@的词时bash将试图执行主机名补全。默认为打开
huponexit
如果设置,当一个交互式登陆shell退出时,bash将发送一个SIGHUP(挂起信号)给所有的作业
interactive_comments
在一个交互式shell中,允许以#开头的词以及同一行中其他的字符被忽略。默认为打开
lithist
如果打开,且cmdhist选项也打开,多行命令将用嵌入的换行符保存到历史中,而无需在可能的地方用分号来分隔
mailwarn
如果设置,且bash用来检查邮件的文件自从上次检查后已经被访问,将显示消息“The mail in mailfile has been read”
nocaseglob
如果设置,当执行文件名扩展时,bash在不区分大小写的方式下匹配文件名
nullglob
如果设置,bash允许没有匹配任何文件的文件名模式扩展成一个空串,而不是它们本身
promptvars
如果设置,提示串在被扩展后再经历变量和参量扩展。默认为打开
restricted_shell
如果shell在受限模式下启动就设置这个选项。该值不能被改变。当执行启动文件时,不能复位该选项,允许启动文件发现shell是否是受限的
sourcepath
如果设置,source内置命令使用PATH的值来寻找包含作为参数提供的文件的目录。默认为打开
source
点(.)的同义词
shift_verbose
如果该选项设置,当移动计数超过位置参量个数时,shift内置命令将打印一个错误消息
变量扩展
测试变量存在性及空值
在变量值不存在时返回默认值,否则返回变量值.
1 2 3 4 |
echo '变量存在与否的判断,语法:${变量名-默认值} var1=10 echo "var1:${var1-1}" echo "var2:${var2-2}" |
在变量不存在或者值为空时返回默认值,否则返回变量值
1 2 3 4 5 |
echo '变量不存在或者值为空的判断,语法:${变量名:-默认值}' var2= echo "var1:${var1:-1}" echo "var2:${var2:-2}" echo "var3:${var3:-3}" |
在变量值为空或者不存在时给变量设置默认值,否则返回变量值
1 2 3 4 |
echo '变量值为空或者不存在时给变量设置默认值,语法:${变量名:=默认值}' echo "var1:${var1:=1}" echo "${var3:=3}" echo "var3:$var3" |
在变量值为空或者不存在时提示错误信息,否则返回变量值
1 2 3 4 |
echo '变量值为空或者不存在时提示错误信息,语法:${变量名:?提示信息}' echo "var3:${var3:?'变量var3不存在'}" echo "var4:$var4" echo "var4:${var4:?'变量var4不存在'}" #这句话会导致后面的脚本无法执行 |
在变量存在时返回指定真值,否则返回null
1 2 3 |
echo '变量存在时返回指定真值,语法:${变量名+真值}' echo "检查var3存在性的结果:${var3+'ture'}" echo "检查var4存在性的结果:${var4+'ture'}" |
总结:
1 2 3 4 5 6 7 8 9 |
格式 描述 ${变量名-默认值} 变量不存在时返回默认值 ${变量名:-默认值} 变量不存在或者为空时返回默认值 ${变量名=默认值} 变量不存在,给变量赋予默认值 ${变量名:=默认值} 变量不存在或为空,给变量赋予默认值 ${变量名?提示信息} 变量不存在时显示错误信息 ${变量名:?提示信息} 变量不存在或为空时显示错误信息 ${变量名+真值} 变量存在时返回真值 ${变量名:+真值} 变量存在且非空时返回真值 |
取字符串子串/字符串长度
取字符串子串,字符串第一个字符编号为0.取子串的方式有两种:
1 |
echo '取子字符串方式一--语法:${变量:位置起点}' |
将由指定的位置开始,截取子字符串到字符串结束位置.
1 2 3 4 |
str1="linux shell" `substr=${str1:6} `echo "子字符串为:$substr" `echo '曲子字符串方式二--语法:${变量:位置起点:长度} |
将由指定起始位置开始,截取指定长度的子字符串.
1 2 |
substr=${str1:0:5} echo "子字符串为:$substr" |
1 2 3 4 5 |
#### 解释 ${变量:位置起点:长度}的用途 echo "-${IFS:0:1}-" echo "-${IFS:1:2}-" echo "-${IFS:2:3}-" |
计算字符串长度
1 2 3 |
echo '计算字符串长度,语法:${#变量名}' echo "$str1的长度为:${#str1}" echo "$substr的长度为:${#substr}" |
在字符串中查找符合规定样式的子串
由字符串前段开始查找,删除相符项
1 2 3 4 5 6 7 8 9 10 |
filename="/usr/share/background" echo "原串为:$filename" echo '由字符串前段开始查找,删除最短匹配项.语法:${变量名#样式}' echo ${filename#/*/} echo '由字符串前段开始查找,删除最长匹配项.语法:${变量名##样式}' echo ${filename##/*/} echo '由字符串尾部开始查找,删除最短匹配项.语法:${变量名%样式}' echo ${filename%/*} echo '由字符串尾部开始查找,删除最长匹配项.语法:${变量名%%样式}' echo ${filename%%a*} |
取代或者删除部分字符串
1 2 3 4 5 6 7 8 9 10 11 12 |
echo '只替换第一个符合项,并且取符合样式的最长子字符串.语法:${变量名/样式/替换字符串}' echo "${filename/\//:}" echo '替换所有符合样式的字符串.语法:${变量名//样式/替换字符串}' echo "${filename//\//:}" echo '删除符合样式的字符串,且只删除第一个符合项.语法:${变量名/样式/}' echo "${filename/\//}" echo '删除所有符合样式的字符串.语法:${变量名//样式/}' echo "${filename//\//}" echo '样式前加上#表示样式必须时在变量值的开头.语法:${变量名/#样式/}' echo "${filename/#\/*\//}" echo '样式前加上%表示样式必须时在变量值的结尾处.语法:${变量名/%样式/}' echo "${filename/%\/*\//}" |
总结:
格式 描述
1 2 3 4 5 6 7 8 9 10 |
${变量名#样式} 删除左边起第一个符合样式的字符串 ${变量名##样式} 删除左边起所有符合样式的字符串 ${变量名%样式} 删除右边起第一个符合样式的字符串 ${变量名%%样式} 删除右边起所有符合样式的字符串 ${变量名/样式/替换字符串} 将第一个符合样式的字符串替换为指定字符串 ${变量名//样式/替换字符串} 将所有符合样式的字符串替换为指定字符串 ${变量名/样式/} 删除变量中第一个符合样式的部分 ${变量名//样式/} 删除变量中所有符合样式的部分 ${变量名/#样式/} 将变量开头处符合样式的部分删除 ${变量名/%样式/} 将变量结尾处符合样式的部分删除 |
取变量名称列表/数组索引列表
取变量名称列表,列出所有变量名中以指定样式开头的变量名称.而且各变量之间使用$IFS定义的第一个分隔符隔开.
1 2 3 |
echo '取变量名称列表.语法:${!样式@}或者${!样式*}' echo "以s开头的变量有:${!s@}" echo "以v开头的变量有:${!v*}" |
获取数组的索引列表,每个索引值之间使用$IFS分隔.可以使用for循环遍历
12345 echo '取数组的索引列表.语法:${!数组变量[@]}或者${!数组变量[*]}'`arr=(linux shell 1 2 3)echo "arr数组为${arr[@]}"echo "arr数组的索引为:${!arr[@]}"echo "arr数组的索引为:${!arr[*]}"
总结:
1 2 3 4 5 |
格式 描述 ${!样式@} 列出已指定样式开头的变量名 ${!样式*} 列出已指定样式开头的变量名 ${!数组名[@]} 列出数组的索引 ${!数组名[*]} 列出数组的索引 |
获取变量值长度
获取变量值的长度.如果是字符串则为字符串的长度
1 2 |
echo '获取变量长度,${#变量名}' echo "$filename的长度为${#filename}" |
别名和取消别名
使用alias可以为命令起别名.
但在一些情况下给重要的命令起别名可能会存在隐患,为了忽略当前定义过的别名,在将要执行的命令前使用\转义,将会忽略定义的别名.
例如:\ls
多命令执行方式
在命令行一次执行多个命令的方式:
- 每个命令之间用;隔开.每个命令的执行结果不会影响其他命令的执行,即每个命令都会被执行但不一定成功.
- 每个命令之间用&&隔开.这种情况下只有前一个命令执行成功才会接着执行下一个命令.
- 每个命令之间用||隔开.这种情况下若前一个命令执行成功将不会再往下执行,只有当前一个命令执行失败时才会执行后面的命令
- 使用()将命令组成一组,然后整组执行.()会开启一个子shell环境来执行其中的命令.
(命令1; 命令2; 命令3; ....)
- 使用{}将命令组成一组,然后整组执行.{}与()不同他会在现在的shell中执行命令组中的命令.注意{}与命令组之间至少得有一个空格隔开.
{ 命令1; 命令2; 命令3; .... }
- 将通过管道传递来的stdin数据作为多个命令的参数.一般情况下我们将stdout通过管道作为另一个命令的参数,但是如果我们想将stdout作为多个命令的参数的话,我们可以使用read将stdin保存在一个变量中,再将这个变量供给其他命令使用.
命令 | {while read 变量; 命令1; 命令2; 命令3; ....}
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Linux 高性能服务器编程:高性能服务器架构一12/05
- ♥ Linux 信号处理一03/24
- ♥ Linux 线程的同步与互斥03/31
- ♥ Linux 高性能服务器编程:网络基础编程二11/28
- ♥ 51CTO:Linux C++网络编程一08/13
- ♥ 包管理器:各平台安装卸载相关记述09/17