Shell:`for`的未定义行为

时间:2013-08-15 07:42:44

标签: bash shell sh

我有一个看起来像这样的脚本:

test.sh

!/bin/bash                                                                  
for i in {0..10}                                                          
  do                                                                         
    echo "Welcome $i times"
  done

如果我像sh test.sh一样运行,我只会Welcome {0..10} times

但是,如果我将其作为bash test.sh运行,我会得到:

Welcome 0 times
Welcome 1 times
 .... and so on

此外,如果我在redhat终端上运行相同的脚本。我收到一个错误:

root@UPLC-PPM-DEV-01 TEST]# sh test.sh 
'est.sh: line 3: syntax error near unexpected token `do
'est.sh: line 3: `  do

这里有什么问题?

2 个答案:

答案 0 :(得分:6)

这与for无关。

只有bash支持{0..10}语法。

简单来说,你可以使用

seq 0 10

(如果您的平台支持)或

i=`expr $i + 1`

创建一个计数器并使用while

答案 1 :(得分:3)

确定要使用的shell,bashshbash有许多语法扩展,您可以显示其中一个。

现在,您可以执行:ls -l /bin/sh并找到:

lrwxrwxrwx. 1 root root 4 Apr 16 11:12 /bin/sh -> bash

但不要误以为你可以交换shbash。该程序使用一种常见的技巧来检查它所调用的名称(在C中,argv[0])。如果程序名称为sh,则会关闭所有扩展名。引用man页面:

如果使用名称sh调用bash,它会尽可能地模仿sh的历史版本的启动行为,同时也符合POSIX标准。