语法错误附近的意外令牌“做”与sudo运行时

从这里: http : //www.sat.dundee.ac.uk/psc/watchdog/watchdog-testing.html

for n in $(seq 1 60); do echo $n; sleep 1; sync; done

我得到:

 :~$ sudo for n in $(seq 1 60); do echo $n; sleep 1; sync; done bash: syntax error near unexpected token `do' 

shell解析命令行,因为看起来像一个sudo的参数,你基本上得到一个没有for

要修复它,在一个子shell中运行循环,或者作为一个单独的脚本,或者像这样;

 sudo sh -c 'for n in $(seq 1 60); do echo $n; sleep 1; sync; done' 

更好的是,避免运行任何不必要的特权用户:

 for n in $(seq 1 60); do echo $n; sleep 1; sudo sync; done 

第一个sudo将需要一个密码,但后续迭代应该缓存,大多数发行版默认设置。

for是一个内部函数(不要与函数混淆),这就是为什么你不能调用它的原因。 你应该明确地调用与这样的代码运行的shell的二进制文件:

 sudo sh -c 'for n in $(seq 1 60); do echo "$n"; sleep 1; sync; done' 

用bash:

 sudo bash -c 'for n in {1..60}; do echo "$n"; sleep 1; sync; done' sudo bash -c 'for ((n = 1; n <= 60; ++n)); do echo "$n"; sleep 1; sync; done' 

这是因为第一个分号终止了sudo命令,这将会do一个新的命令。 解决这个问题的最简单的方法就是将循环放在一个文件中并执行它

 sudo /bin/bash ./myfile