1 shell
1.1 $( )与反引号 ` ` 参考
$()与 ` `都是用来做命令替换的,也就是$()与 ` `内的内容都会被当成命令,完成命令重组功能。在多层次的复合替换中,尽量使用\$()。
ommand1 `command2 `command3` `
原本的意图是要在 command2 `command3` 先将 command3 提换出来给 command 2 处理,然后再将结果传给 command1 `command2 …` 来处理。然而,真正的结果在命令行中却是分成了 `command2 ` 与 ``两段。
正确的输入应该如下:
command1 `command2 \`command3\` `
换成 $( ) 就没问题了:
command1 $(command2 $(command3))
` ` 基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高。而 $( ) 并不见的每一种 shell 都能使用。
1.2 ${} 参考
${}可以用来作变量替换,${}内的内容会被当成变量,实际上$var与${var}中,var都会被当成变量。但是当变量后如果跟有字符串时,用${}代码会更清晰。如$vari和${var}i,前者vari会被当成一个变量,而后者是var变量替换后再跟i
${}还可以用来操作字符串,作用类似linux中的str类函数。
${#var} //获取字符串长度
${var#*/} //去掉从左边开始直到第一个/(包含/)
${var##*/} //去掉从左边开始直到最后一个/(包含/)
${var%/*} //去掉从右边开始直到第一个/(包含/)
${var%%/*} //去掉从右边开始直到最后一个/(包含/)
${var:start:len}//从左边第start个字符开始以及子串中字符的个数,下标与数组相同,从0开始
${var:start} //从左边第start个字符开始一直到结束
${var:0-start:len}//从右边第start个字符开始以及字符的个数
${var:0-start} //从右边第start个字符开始一直到结束
下面是使用示例
var=https://mp.youkuaiyun.com/mdeditor
echo ${#var} // 28
echo ${var#*/} // /mp.youkuaiyun.com/mdeditor
echo ${var##*/} // mdeditor
echo ${var%/*} // https://mp.youkuaiyun.com
echo ${var%%/*} // https:
echo ${var:11:4} // csdn
echo ${var:11} // youkuaiyun.com/mdeditor
echo ${var:0-12:3} // net
echo ${var:0-12} // net/mdeditor
可以用${ } 针对不同的变量状态赋值(未定义(unset)、空值(null)、非空值(non-null)),unset在shell中是删除已定义的shell变量(包括环境变量)和shell函数,unset命令不能够删除具有只读属性的shell变量和环境变量
${file-test} file 未定义,则使用 test 作传回值。(空值及非空值时不作处理)
${file:-test} file 未定义或为空值,则使用 test 作传回值。 (非空值时不作处理)
${file+test} file 设为空值或非空值,均使用 test 作传回值。(未定义时不作处理)
${file:+test} file 为非空值,则使用 test 作传回值。 (未定义及空值时不作处理)
${file=test} file 未定义,则使用 test 作传回值,同时将 $file 定义为 test 。 (空值及非空值时不作处理)
${file:=test} file 未定义或为空值,则使用 test 作传回值,同时将 $file 定义为 test 。 (非空值时不作处理)
${file?test} file 未定义,则将 test 输出至 STDERR。 (空值及非空值时不作处理)
${file:?test} file 未定义或为空值,则将 test 输出至 STDERR。 (非空值时不作处理)
1.3 $(( )) 用来作整数运算
在shell中,$(( )) 的整数运算符号大致有这些:+ - * / :分别为 “加、减、乘、除”;% :余数运算;& | ^ !:分别为 “AND、OR、XOR、NOT” 运算。都是常见的运算符,$(( ))内被当成运算表达式。示例:
a=1; b=2; c=3
echo $((a + b + c)) # 也可以加$来表示变量:echo $(($a + $b + $c))
6
$(( )) 还可作不同进位(如二进制、八进位、十六进制)作运算,只是,输出结果皆为十进制而已
$((16#FF))
返回16进制数0xFF的十进制值。
纯用 (( )) 也可重定义变量值,或作测试(相当于[ ]):
a=5; ((a++)) 可将 $a 重定义为 6
a=5; b=7; ((a < b)) 会得到 0 (true) 的返回值。
常见的用于 (( )) 的测试符号有如下这些:
<:小于
>:大于
<=:小于或等于
>=:大于或等于
==:等于
!=:不等于