2017-04-12 48 views
0

我找不出爲什麼我的腳本不顯示由空格分隔的字符串。如何在shell腳本中將行分隔爲空白區域

這是我的代碼:

While read -r row 
do 

    line = ($row) 
    for word in $line 
    do 
     echo ${word[0]} 
    done 
done < $1 

說該行是 「增加$ S0 $ S0 $ T1」

i want the output to be "add" 

回答

1
While read -r row 

這將嘗試運行名爲While命令,你可能會得到一個錯誤的那個。 shell關鍵字是while

do  
    line = ($row) 

這將嘗試運行名爲line命令,這是從GNU的coreutils(line - read one line)程序,但可能不是你想要的。在shell中的賦值必須是而不是在等號周圍有空格。

如果分配工作,它會創建一個名爲line的數組。

for word in $line 

僅按名稱引用數組擴展到它的第一項,所以循環在這裏沒用。

do 
     echo ${word[0]} 

這裏,索引是不是非常有用,因爲word將是一個值,而不是一個數組。

我懷疑你想要的東西是這樣的:

while read -r row ; do 
    words=($row); 
    echo "${words[0]}" 
done 

但如果$row包含水珠字符,如*,他們將擴大到匹配的文件名。

這會更好:

read -r -a words 
echo "${words[0]}" 

或者乾脆

read -r line 
echo "${line%% *}"  # remove everything after the first space 
+1

或者簡單的'read -r word _;回聲「$單詞」'。 –

0

這項工作很好:

while read -r row 
do 
    echo $row | awk '{print $1}' 
done 

while read -r row問用戶輸入並將其存儲在row變量中,awk '{print $1}'僅顯示用戶輸入的第一個字。

+0

沒有我不接受來自用戶的輸入,線路是從另一個文件。該文件是參數。 –

0

你想在單獨的行上使用每個令牌嗎?爲什麼不使用sed

$ echo "1 2 3 hi" | sed -r 's/[ \t]+/\n/g' 
1 
2 
3 
hi 

如果你想每一行的第一個字,則:

$ echo "1 2 3 hi" | sed -r 's/^([^ \t]+).+/\1/' 
1 

如果它是一個文件,然後刪除「回聲... |」,只是給的文件名作爲參數傳遞給sed的:

$ sed -r 's/^([^ \t]+).+/\1/' file.txt