我找不出爲什麼我的腳本不顯示由空格分隔的字符串。如何在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"
我找不出爲什麼我的腳本不顯示由空格分隔的字符串。如何在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"
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
這項工作很好:
while read -r row
do
echo $row | awk '{print $1}'
done
while read -r row
問用戶輸入並將其存儲在row
變量中,awk '{print $1}'
僅顯示用戶輸入的第一個字。
沒有我不接受來自用戶的輸入,線路是從另一個文件。該文件是參數。 –
你想在單獨的行上使用每個令牌嗎?爲什麼不使用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
或者簡單的'read -r word _;回聲「$單詞」'。 –