$ While [[ `seq 1 10 | shuf | head -n 1` != "1" ]]; do echo "retry"; done
问题结果发现:`seq 1 10 | shuf | head -n 1`是反引号`,不是单引号’
1.认成单引号和双引号执行情况:里面是字符不执行
test_watch.sh
执行bash脚本debug
$ bash -x test_watch.sh
2. 正确表述
执行bash脚本debug
$ bash -x test_watch.sh
附1:Linux下的特殊字符
附2:双中括号[[]]
双中括号[[]],[[ “KaTeX parse error: Expected 'EOF', got '&' at position 9: a" != 2 &̲& "g” = 3 ]] <=> [ “
a
"
!
=
2
−
a
"
a" != 2 -a "
a"!=2−a"g” = 3 ]
- [[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
- 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
- 使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。
- bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
if ($i<5)
if [ $i -lt 5 ]
if [ $a -ne 1 -a $a != 2 ]
if [ $a -ne 1] && [ $a != 2 ]
if [[ $a != 1 && $a != 2 ]]
for i in $(seq 0 4);do echo $i;done
for i in seq 0 4;do echo $i;done
for ((i=0;i<5;i++));do echo $i;done
for i in {0..4};do echo $i;done
标签:单引号,watch,sh,中括号,&&,Linux,test,bash
From: https://blog.csdn.net/m0_59034502/article/details/143904900