【问题标题】:Why running a for loop in bash resulting in undesired output and not a loop? [duplicate]为什么在 bash 中运行 for 循环会导致不需要的输出而不是循环? [复制]
【发布时间】:2023-03-25 19:29:01
【问题描述】:

我正在尝试在 Bash shell 中编写一个 for 循环。 这是我想出的:

for i in {0..20..5}
do
  echo "Number: $i"
done

但是输出是:

Number: {0..20..5}

我也试过这个代码:

N=10
for i in 1 2 3 4 5 .. $N
  do
     echo "Welcome $i times"
 done

但在这种情况下,输出也是:

Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times
Welcome .. times
Welcome 10 times

我想编写一个 for 循环,我可以在其中获取限制以及增量或减量值。

这是完整的脚本:

#! usr/bin/bash

N=10
for i in 1 2 3 4 5 .. $N
  do
     echo "Welcome $i times"
 done

for i in {0..20..5}
do
  echo "Number: $i"
done

【问题讨论】:

  • 你确定第一个使用的是 bash 吗?
  • 是的。我使用的外壳是 bash。我在原始问题@Shawn 中添加了完整的脚本供您参考
  • bash 有{start..end},但没有{start..end..increment}。此外,由于brace expansion occurs before variable substitution,您不能将变量放入{start..end},除非您使用eval。您可以使用 C 风格的 for 循环——参见手册中的3.2.5.1 Looping Constructs
  • {x..y[..incr]} 可以在 bash 上正常工作(请参阅:gnu.org/software/bash/manual/bash.html#Brace-Expansion)...但从第 4 版开始使用 incr(请参阅:wiki.bash-hackers.org/syntax/expansion/brace
  • @ShouryaShikhar, #! usr/bin/bash 应该是 #!/usr/bin/bash,假设 shell 确实在 /usr/bin/ 中。当您省略领先的 / 时,它不再是绝对路径。 (顺便说一句,如果您不知道/usr/bin 是正确的,请使用#!/usr/bin/env bash,这样PATH 将用于查找;这对于可能在非操作系统中拥有更新版本的bash 的MacOS 用户尤其重要-供应商提供的位置)。

标签: bash loops shell sh


【解决方案1】:

脚本似乎是正确的。

但是正如您在 cmets 中指出的那样,使用 sh 运行脚本似乎是这里的问题。

在基于 Debian 的发行版中,现在 sh 链接到“dash”而不是“bash”。因此,当您执行 sh 时,您很可能一直在使用破折号运行此脚本。

要检查sh 是否链接到“破折号”,请运行

ls -la /bin/sh

如果输出内容如下: lrwxrwxrwx 1 root root 4 Oct 18 19:37 /bin/sh -> dash,符号链接到“破折号”。

现在,这应该可以解决问题了。

  1. 首先使脚本可执行。
chmod +x <script_name>.sh
  1. 立即尝试运行脚本
./<script_name>.sh

这将在 bash 中运行脚本。

【讨论】:

  • 即使sh 链接到 bash,当在 sh 名称下调用时,它仍然会关闭某些功能(在 set -o posix 模式下运行)。将shbash 视为同义词永远不可靠。
  • 在这种情况下,大括号扩展不是禁用的功能之一。
  • 另外,请注意,将 .sh 名称放在可执行文件上并不是一个好习惯——扩展应该用于旨在从另一个解释器获取的脚本或作为库加载的脚本,而不是命令选择自己的口译员。参见commandname extensions considered harmful,一篇从bash IRC channel factoid on the topic 链接多年的文章。
猜你喜欢
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2019-08-22
  • 2013-04-30
  • 2020-01-14
  • 2018-06-25
相关资源
最近更新 更多