我有一個這樣的文本檔案;
192.168.1.1 apple orange
192.168.1.2 banana
192.168.1.3 kiwi melon cherry
我想逐行遍歷這個檔案,并將每行中的專案分配給多個引數。例如,當我像這樣運行它時;
for loop from textile above;
echo "Args: $1 $2 $3 $4"
done
它應該給出這個輸出;
Args: 192.168.1.1 apple orange
Args: 192.168.1.2 banana
Args: 192.168.1.3 kiwi melon cherry
此外,正如您所看到的,每行在固定的 IP 之后可能包含 1 到 3 個引數。所以 IP 總是在那里,它是$1,其余的可以在$2和之間改變$4。
我怎樣才能做到這一點?我能夠通過使用讀取檔案,mapfile但無法從中獲取引數。
uj5u.com熱心網友回復:
mapfile將其標準輸入的行分配給索引陣列的條目,而您希望將每行的欄位分配給陣列。這是不一樣的。如果您的輸入檔案與您顯示的一樣簡單,則可以使用以下內容:
$ while read -r -a args; do
set -- "${args[@]}"
echo "$# arguments: $@"
done < textfile.txt
3 arguments: 192.168.1.1 apple orange
2 arguments: 192.168.1.2 banana
4 arguments: 192.168.1.3 kiwi melon cherry
但是如果您的輸入更復雜(例如,引數中有空格),這當然不會像您期望的那樣作業。
編輯:改變set "${args[@]}"要set -- "${args[@]}"看到保羅的回答之后。
uj5u.com熱心網友回復:
僅基于 OP 所需的輸出:
$ sed 's/^/Args: /' textfile.txt
Args: 192.168.1.1 apple orange
Args: 192.168.1.2 banana
Args: 192.168.1.3 kiwi melon cherry
假設 OP 的真正要求是對值做一些事情(除了 echo 到 stdout):
while read -r ip fruit1 fruit2 fruit3
do
echo "Args: ${ip} ${fruit1} ${fruit2} ${fruit3}" # yeah, extra spaces when fruit? is empty but visually not noticeable
# or do other stuff ...
done < textfile.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/330968.html
