dash double semicolon(;;)语法

val*_*zka 40 syntax sh dash-shell

我试图找到并行运行多个命令的方法sh并等待它完成.我发现以下不起作用(sh: 1: Syntax error: ";" unexpected):

sh -c '(sleep 3 && echo 1) & ; (sleep 3 && echo 2) & ;  wait'
Run Code Online (Sandbox Code Playgroud)

但是这种语法按预期工作:

sh -c '(sleep 3 && echo 1) & ;; (sleep 3 && echo 2) & ;;  wait'
Run Code Online (Sandbox Code Playgroud)

但我不明白有什么区别.我的问题是;;它应该被使用的含义是什么?

Gil*_*il' 59

;;仅用于case构造,以指示替代的结束.(它存在break于C中的位置)

case $answer in
  yes) echo 'yay!';;
  no) echo 'boo!';;
esac
Run Code Online (Sandbox Code Playgroud)

语法上,;并且&两个标记命令的结束.换行符相当于;第一个近似值.它们之间的区别在于,;换行符表示该命令必须在前台执行,而&表示该命令必须在后台执行.

所以在这里你需要& wait.& ;是语法错误(您不能有空命令).& ;;也是一个语法错误; 灰烬让它走了(就好像你刚写的那样&),但是bash抱怨道.显然你的sh是一些灰变种(例如破折号,这是/bin/sh许多Debian衍生物).


Ign*_*ams 8

它应该case在案例之间的陈述中使用.您在这里的问题是,无论是&;是命令分隔符,你应该只使用其中的一个.