bash中的迭代不起作用

时间:2017-05-05 02:07:33

标签: bash

我正在尝试在bash上运行下一个代码。它可以起作用,但事实并非如此。 你能帮我解决一下吗?我开始编程。 代码是这样的:

for i in {1:5}
do
   cd path-to-folder-number/"$i"0/
   echo path-to-folder-number/"$i"0/
done

示例

我想迭代具有数字(10,20..50)的文件夹,因此它将目录从“path-to-folder-number / 10 /”更改为“path-to-folder-number / 20” /“..等等。

我替换:用..但它还没有工作。当脚本被应用时,我得到:

can't cd to path-to-folder-number/{1..5}0/ 

4 个答案:

答案 0 :(得分:1)

对于up范围,语法为:

for i in {1..5}
do
   cd path-to-folder-number/"$i"0/
   echo $i
done

因此请将:替换为..

答案 1 :(得分:1)

要准确得到你想要的东西,你可以使用它:

for i in 10 {20..50}
do
    echo $i
done

答案 2 :(得分:1)

我认为这里有三个问题:你使用了错误的shell,一个范围的错误语法,如果你解决了这些问题,你可能也会遇到连续cd没有做你想做的事情的麻烦

  • shell问题是您使用sh而不是bash运行脚本。在某些系统上sh实际上是bash(但在POSIX兼容模式下运行,某些高级功能已关闭),但我认为在你的系统上它是一个更基本的shell,没有任何 bash扩展名。

    控制脚本运行的shell的最佳方法是在开头添加一个“shebang”行,说明要运行它的解释器。对于bash,这可能是#!/bin/bash#!/usr/bin/env bash。然后通过将脚本放在$ PATH中的目录中运行脚本,或者显式地给出脚本的路径(例如,如果你在同一个目录中,则使用./scriptname)。 使用sh scriptname运行它,因为它会覆盖shebang并使用基本shell,它将无效。

    (顺便说一下,“shebang”这个名字来自行开头的“#!”字符 - “#”字符有时被称为“sharp”,而“!”有时被称为“bang”,所以它是“sharp-bang”,缩写为“shebang”。)

  • 在bash中,大括号扩展中范围的正确语法是{1..5},而不是{1:5}。请注意,大括号扩展是一个bash扩展,这就是为什么让正确的shell很重要。

  • 最后,您还没有遇到过一个问题,但可能会解决前两个问题:cdpath-to-folder-number/10/,然后是path-to-folder-number/20/等等你是 cd回到原来的目录,所以如果path-to-folder-number是相对的(即不以“/”开头) ,它会尝试cdpath-to-folder-number/10/path-to-folder-number/20/path-to-folder-number/30/path-to-folder-number/40/path-to-folder-number/50/

    IMO在脚本中使用cd通常是一个坏主意,因为有很多事情可能会出错。很容易忘记脚本在哪个位置。如果任何cd因任何原因失败,则脚本的其余部分将在错误的位置运行。如果您有相对路径指定的任何文件,那么只要您cd在原始目录以外的地方,这些路径就会变为无效。

    仅使用显式路径引用脚本中的文件位置就不那么脆弱了。因此,例如,使用cd "path-to-folder-number/${i}0/"; ls

  • 而不是ls "path-to-folder-number/${i}0/"

答案 3 :(得分:1)

您还可以使用seq

for i in $(seq 10 10 50);  do
   cd path-to-folder-number/$i/
   echo path-to-folder-number/$i/
done