如何在bash中以root身份在命令行上运行for循环

时间:2017-02-25 19:56:16

标签: linux bash command-line sudo

我正在尝试运行一个简单的for循环来检查并显示几个硬盘的温度,如下所示:

for drive in a b c d e f g; do hddtemp "/dev/sd$drive"; done

如果我su到root,这很有用,但我想在命令行上运行它或其他循环类型的单行命令,如果可能的话,可能需要sudo。
如果我试试

sudo for drive in a b c d e f g; do hddtemp "/dev/sd$drive"; done;

我收到此错误:

  

bash:意外标记“do”

附近的语法错误

如果我省略最后的;(分号)

,则与上述相同

将命令括在"(双引号)中会得到以下结果:

  

sudo:用于驾驶汽车;做hddtemp / dev / sdg;完成:命令   找不到

将命令括在后面(`

sudo "`for drive in a b c d e f g; do hddtemp "/dev/sd$drive"; done`" 

为指定的驱动器号/规格的每个实例提供错误:

  

/ dev / sda:open:权限被拒绝后跟sudo ::   命令未找到

是否可以将命令行作为命令行运行for(或其他循环)命令,或者在bash中使用我的root凭据?

Ubuntu linux 16.04LTS / GNU bash 4.3.46(1)

3 个答案:

答案 0 :(得分:3)

我建议:

for drive in a b c d e f g; do sudo hddtemp "/dev/sd$drive"; done

sudo bash -c 'for drive in a b c d e f g; do hddtemp "/dev/sd$drive"; done'

答案 1 :(得分:2)

其他答案告诉您如何解决使用sudo循环命令的问题。但是,你实际上并不需要循环,因为sudo hddtemp /dev/sd{a,b,c,d,e,f,g} 显然可以采用多个参数,所以你可以这样做

sudo hddtemp /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg

(没有引号 - 它们会阻止大括号扩展),扩展为

sudo hddtemp /dev/sd{a..g}

如果您的驱动器确实被称为,那么您可以缩短到

{{1}}

答案 2 :(得分:0)

不要将sudo放在for循环之前。以下工作正常。

for drive in {a..g}; do sudo hddtemp "/dev/sd$drive"; done