Linux 当从.sh文件执行时,Bash foreach循环的工作方式不同

Linux 当从.sh文件执行时,Bash foreach循环的工作方式不同,linux,bash,shell,Linux,Bash,Shell,以下“oneliner”满足我的需要: $ for i in {1..5}; do echo $i; done 1 2 3 4 5 然而,当我将完全相同的代码放入for-each.sh文件并执行它时,我得到了不同的结果。为什么? 对于-each.sh文件: #!/bin/bash for i in {1..10}; do echo $i; done 执行后的结果: $ ./for-each.sh {1..10} 编辑 用友。我很抱歉。现在我注意到我是通过sh./for-each.sh而不是

以下“oneliner”满足我的需要:

$ for i in {1..5}; do echo $i; done
1
2
3
4
5
然而,当我将完全相同的代码放入for-each.sh文件并执行它时,我得到了不同的结果。为什么?

对于-each.sh文件:

#!/bin/bash
for i in {1..10}; do echo $i; done
执行后的结果:

$ ./for-each.sh
{1..10}
编辑


用友。我很抱歉。现在我注意到我是通过sh./for-each.sh而不是通过./for-each.sh执行for-each.sh命令的。我不知道bash,sh,dash。。。阅读后,我意识到我在Debian机器上通过破折号执行了文件,默认情况下该文件指向/bin/sh。

如果您确信它确实是
bash
在执行脚本,您可以显式地打开大括号扩展(
{…}
表达式的扩展),如下所示:

set -B   # same as: set -o braceexpand
让这成为你的脚本在shebang之后的第一个命令。 (相反,
set+B
set+o braceexpand
)将关闭大括号扩展。)


可以想象,您的系统被配置为默认关闭大括号扩展。

如果您确信它确实在执行脚本,您可以显式地打开大括号扩展(
{…}
表达式的扩展),如下所示:

set -B   # same as: set -o braceexpand
让这成为你的脚本在shebang之后的第一个命令。 (相反,
set+B
set+o braceexpand
)将关闭大括号扩展。)


可以想象,您的系统配置为默认情况下关闭支架扩展。

您的默认bash路径是什么?你能检查一下哪个bash也返回了
/bin/bash
吗?
哪个bash
返回了
/bin/bash
顺便说一句,上面的例子对我有效。当我使用
sh./for each.sh
@AaronDigulla时它不起作用。这不是那个问题的重复,这个问题要求在大括号扩展中使用一个变量。这个问题只使用常量:
{1..10}
。其他亲密的选民:这怎么不是关于编程的?它也不是真正的复制品。真正的问题是,当您为每个.sh键入
sh./时,
#行被悄悄忽略。使用的目的是让您直接执行脚本:
/for each.sh
——或者更好的是,
/for each.bash
——或者更好的是,
/for each
(用户为什么要关心它是用什么语言编写的)?在任何情况下,文件名的后缀都不起作用(除非您在Windows上)。默认bash路径是什么?你能检查一下哪个bash
也返回了
/bin/bash
吗?
哪个bash
返回了
/bin/bash
顺便说一句,上面的例子对我有效。当我使用
sh./for each.sh
@AaronDigulla时它不起作用。这不是那个问题的重复,这个问题要求在大括号扩展中使用一个变量。这个问题只使用常量:
{1..10}
。其他亲密的选民:这怎么不是关于编程的?它也不是真正的复制品。真正的问题是,当您为每个.sh键入
sh./时,
#行被悄悄忽略。使用的目的是让您直接执行脚本:
/for each.sh
——或者更好的是,
/for each.bash
——或者更好的是,
/for each
(用户为什么要关心它是用什么语言编写的)?在任何情况下,文件名的后缀都不起作用(除非您在Windows上)。