Shell - yellia1989/learn-doc GitHub Wiki

单引号和双引号的使用场景

首先,单引号和双引号,都是为了解决中间有空格的问题。

因为空格在linux中时作为一个很典型的分隔符,比如string1=this is astring,这样执行就会报错。为了避免这个问题,因此就产生了单引号和双引号。他们的区别在于,单引号将剥夺其中的所有字符的特殊含义,而双引号中的'$'(参数替换)和'`'(命令替换)是例外。所以,两者基本上没有什么区别,除非在内容中遇到了参数替换符$和命令替换符`。

所以下面的结果:

num=3
echo ‘$num
$num
echo “$num”
3

所以,如果需要在双引号””里面使用这两种符号,需要用反斜杠转义。

变量带双引号和不带双引号的区别

带了双引号就是一个字符串,不带双引号可能是数组

[]和的使用场景

[是bash内部命令和test等同,这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。

双中括号是bash的关键字,bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。在双中括号之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。支持字符串的模式匹配;&&、||、<和> 操作符能够正常存在于双中括号条件判断结构中

不推荐使用[,推荐使用[[

(())的使用场景

①整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是"假",而一个非零值的表达式所返回的退出状态码将为0,或者是"true"。若是逻辑判断,表达式exp为真则为1,假则为0。

②只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)

③单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6

④常用于算术运算比较,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i in seq 0 4或者for i in {0..4}。再如可以直接使用if (($i<5)), 如果不使用双括号, 则为if [ $i -lt 5 ]。

状态码和标准输出使用场景

状态码是函数的return值,是命令的退出状态码,调用函数或命令后使$?获得,if语句检测状态码为0就执行
标准输出是函数或命令的输出到标准输出的内容,使用$()命令来获取函数或命令往标准输出中输入的内容