2016-02-29 79 views
0

下面進入命令行值是提取命令行輸入bash腳本代碼:如何使用循環

input=(*); 
for i in {1..5..1} 
do 
    input[i]=$($i); 
done; 

我的問題是:如何獲得$ 1,$ 2,$ 3,$ 4個值從輸入命令行,其中的命令行輸入代碼是:

bash script.sh "abc.txt" "|" "20" "yyyy-MM-dd" 

注:在 「$ {@}」

0123不使用對於i
+0

「我在」$ @「中出現了什麼問題;做...'?你不喜歡它嗎? –

+0

你可以簡單地寫'for i;做...',不需要添加'in「$ @」'。我認爲這是遍歷輸入參數的最自然的方式。 – user1934428

回答

2
#!/bin/bash 

for ((i=$#-1;i>=0;i--)); do 
    echo "${BASH_ARGV[$i]}" 
done 

例子:./script.sh a "foo bar" c

輸出:

 
a 
foo bar 
c 
+0

在bash腳本中,我們可以使用'$ 1','$ 2'等提取輸入值...所以我們如何使用for循環提取這些值,其中1,2值是實用的。 – RaiBnod

0

如果我正確理解你想要做什麼,你可以寫:

input=("[email protected]") 

複製位置參數放入名爲input的數組中。

如果你特別想只有前五個位置參數,你可以寫:

input=("${@:1:5}") 

編輯補充:或者,你問,因爲是整數2變量i,你怎麼能得到$2?如果這是您的問題,那麼您可以使用間接擴展,其中Bash檢索變量的值,然後使用該值作爲要替換的變量的名稱。間接擴大使用!字符:

i=2 
input[i]="${!i}"  # same as input[2]="$2" 

這幾乎總是一個壞主意,但。你應該重新思考你在做什麼。

0

我不知道你有什麼反對for i in "[email protected]"; do...,但你肯定能做到這一點與shift,例如:

while [ -n "$1" ]; do 
    printf " '%s'\n" "$1" 
    shift 
done 

輸出

$ bash script.sh "abc.txt" "|" "20" "yyyy-MM-dd" 
'abc.txt' 
'|' 
'20' 
'yyyy-MM-dd' 

就個人而言,我不看看爲什麼你排除for i in "[email protected]"; do ...這是一個有效的方式來迭代通過保留引用空格的參數。您也可以使用數組和C樣式循環,如其他答案中所示。

note:如果您打算使用您的input陣列,則應該使用input=("[email protected]")而不是input=($*)。使用後者將不會保留位置參數中的引號空格。例如

input=("[email protected]") 
for ((i = 0; i < ${#input[@]}; i++)); do 
    printf " '%s'\n" "${input[i]}" 
done 

工作正常,但如果你使用input=($*)帶參數線"a b",它將把這些作爲兩個單獨的參數。