Bash foreach loop works differently when executed from .sh file
以下'oneliner'做我需要的:
1 2 3 4 5 6
| $ for i in {1..5}; do echo $i; done
1
2
3
4
5 |
但是,当我将完全相同的代码放入for-each.sh文件并执行它时,我会得到不同的结果。 为什么?
for-each.sh文件:
1 2
| #!/bin/bash
for i in {1..10}; do echo $i; done |
执行后的结果:
1 2
| $ ./for-each.sh
{1..10} |
编辑
UF。 对不起。 现在我注意到我通过sh ./for-each.sh命令而不是./for-each.sh执行了for-each.sh。 我不知道bash,sh,dash之间的区别......阅读完stackoverflow.com/a/5725402/915756后,我意识到我是用破折号执行文件,默认情况下我的Debian机器指向/ bin / sh。
-
你的默认bash路径是什么?你能检查which bash是否也返回/bin/bash吗?
-
which bash返回/bin/bash
-
上面的例子对我有用,顺便说一句。当我使用sh ./for-each.sh时,它不起作用
-
也许你有不同的bash版本。我的GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)
-
这就是我问你使用的bash是否正常的原因。有趣的是,在你的命令行(bash)它可以工作,但不是在用bash调用的脚本中。大括号是bash,所以...我不知道。当然seq会成功,但对于为什么它不能在脚本下工作感到好奇。
-
怎么样尝试:/ bin / bash -xv ./for-each.sh
-
你确定#!/bin/bash线是否正确?您是否将脚本复制并粘贴到您的问题中?该行上的拼写错误可能导致脚本由/bin/sh而不是/bin/bash执行。键入/bin/bash ./for-each.sh时会发生什么?
-
@AaronDigulla:这不是那个问题的重复,它询问在大括号扩展中使用变量。这个问题只使用常量:{1..10}。其他亲密的选民:这不是关于编程的?
-
@KeithThompson你完全正确,我也不理解近距离投票。请参阅更新的问题,因为正是这样,使用sh而不是bash执行。
-
这也不是这个问题的重复。真正的问题是当你输入sh ./for-each.sh时,会静静地忽略#!行。 shebang的目的是让你直接执行脚本:./for-each.sh - 或者更好,./for-each.bash - 或者更好,./for-each(为什么用户应该关心它所写的语言)?在任何情况下,文件名的后缀都没有效果(除非您在Windows上)。
如果您确信bash确实执行了脚本,则可以显式启用大括号扩展(扩展{...}表达式),如下所示:
1
| set -B # same as: set -o braceexpand |
在你的shebang之后,这是你的脚本的第一个命令。
(相反,set +B(set +o braceexpand)会将撑杆延伸关闭。)
可以想象,您的系统配置为默认关闭大括号扩展。