2017-05-05 73 views
1

我想在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)文件夹,所以从“路径到文件夹目录改变 - 数字/ 10 /“到”路径到文件夹号/ 20 /“..等等

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

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

因为我在{1..5};做echo $ i;完成 –

+0

@JohnC我做到了,但我得到了:无法cd到路径到文件夹号/ {1..5} 0 /我改变了一点脚本,请再次看到帖子 – santimirandarp

+3

@santimirandarp这表明你没有使用bash,但是其他一些不支持大括号扩展的shell。剧本的剧本是什么?你如何运行它? –

回答

1

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

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

    控制脚本运行的shell的最佳方法是在开始时添加一个“shebang”行,说明要使用哪个解释器。对于bash,那可以是#!/bin/bash#!/usr/bin/env bash。然后通过将脚本放置在$ PATH中的目录中,或者明确指定脚本的路径来运行该脚本(例如,如果在同一个目录中,则使用./scriptname)。做不是运行它与sh scriptname,因为这将覆盖shebang和使用基本的外壳,它不会工作。 (顺便说一下,名称“shebang”来自“#!”字符行开头 - “#”字符有时被称为“尖锐”,而“!”有时被称为“爆炸”,所以它是“sharp-bang”,缩写为“shebang”。)

  • 在bash中,大括号扩展中的范围的正确语法是{1..5},而不是{1:5}。请注意,大括号扩展是bash扩展名,这就是为什么获得正确的shell的原因。

  • 最后,你还没有真正碰上又一个的问题,但可能当你拿到固定的前两个问题:你cdpath-to-folder-number/10/,然后path-to-folder-number/20/,等你是不是cd荷兰国际集团回原始目录之间,所以如果路径到文件夹号是相对的(即不以“/”开头),它会尝试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 "path-to-folder-number/${i}0/"; ls,请使用ls "path-to-folder-number/${i}0/"

1

在长达范围的语法是:

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

所以更换:..

+0

我认为你是对的,但它不工作,**我得到:**不能光盘路径到文件夹号/ {1..5} 0 /我改变了一点脚本,请参阅这个帖子再次 – santimirandarp

1

要获得正是你想要,你可以使用这个东西:

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

我想OP想要10,20,30,40和50 ...不是10,20,21等最多49,50 ...换句话说'{1..5} 0' – Sundeep

+0

你是对的,但我重新提出了这个问题,我认为它改变了,不是吗? – santimirandarp

1

您还可以使用seq

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