2017-05-05 69 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