【问题标题】:Syntax error: Bad for loop variable语法错误:循环变量错误
【发布时间】:2015-08-02 04:42:19
【问题描述】:

我正在尝试编写一个脚本,可以在后台启动收音机

#!/bin/sh

for (( i = 80 ; i <= 101; i++ )) 
 do 
  amixer cset numid=1 i$% sleep 60;
done 

但我有问题:

alarmclock-vol.sh: 3: alarmclock-vol.sh: Syntax error: Bad for loop variable

【问题讨论】:

  • 因为sh isn't bashfor (( … )) 在 sh 中不可用。
  • @kojiro: sh 可能是也可能不是bash;在某些系统上,/bin/sh 是指向/bin/bash 的符号链接,上面的脚本可能会起作用。无论如何,你当然不应该假设它是。
  • @KeithThompson,尽管sh 是指向bash 的符号链接,但当作为 sh(启用 posix 模式)调用时,bash 的行为也会有所不同。因此,即使 sh 是 bash,“sh is not bash”仍然适用。
  • @geirha:在我的 Debian 6 系统上,/bin/sh 是指向/bin/bash 的符号链接,for (( ... )) 语法在带有#!/bin/sh 的脚本中工作; #!/bin/dash 它给了我"Syntax error: Bad for loop variable"。 (如果重要的话,那就是 bash 4.1.5。)
  • @KeithThompson,是的,某些语法仍然有效(如本例中的 for ((...))),有些行为略有不同(source. 内置函数),而某些语法完全禁用(如进程替换 &lt;(...)&gt;(...) )。这些只是现在想到的例子。

标签: bash sh


【解决方案1】:

for (( expr ; expr ; expr )) 语法在 sh 中不可用。如果您想使用该语法,请切换到 bash 或 ksh93。否则,sh 的等价物是:

#!/bin/sh

i=80
while [ "$i" -le 101 ]; do
    amixer cset numid=1 "$i%"
    sleep 60
    i=$(( i + 1 ))
done 

【讨论】:

  • 仅供参考,要更改为 bash,请将您的 hashbang(脚本的第一行)更改为 #!/bin/bash
【解决方案2】:

使用 bash 代替 sh

bash alarmclock-vol

【讨论】:

    【解决方案3】:

    尝试使用

    #!/usr/bin/bash
    

    而不是

    #!/bin/bash
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2014-10-14
    • 2019-01-26
    • 2014-01-23
    • 1970-01-01
    相关资源
    最近更新 更多