我正在編寫一個腳本,該腳本讀取用戶的輸入並使用awk
.我希望在腳本末尾使用這些字段之一,因此我嘗試將其存儲在某個變數中,但徒勞無功。
一種可能的解決方案是保存輸入並awk
在最後再次使用它進行處理,但我想知道是否有任何方法可以在某些變數中保留已處理的資訊。
例如,
read -p "Enter args: "; echo -n $REPLY | awk '{ \*Do some stuff with fields*\; nth=$3}'
# More script
echo "Your 3rd argument was $nth"
但上面不起作用。nth
末尾為空(這意味著它是本地的awk
?)。
TIA
答案1
不確定為什麼需要 awk,但您可以添加該-a
標誌,read
以便獲得一個數組。假設您正在討論的欄位/列由空格分隔/分隔。
read -rp "Enter args: " -a input
printf 'Your 3rd argument was %s\n' "${input[2]}"
- 請記住 bash 數組從零索引開始。
您可以循環輸入。
read -rp "Enter args: " -a input
for ((i=0; i<${#input[@]}; i++)); do
printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done
或者像這樣
read -rp "Enter args: " -a input
for i in "${!input[@]}"; do
printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done
但這是我使用 awk 要做的事情。
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $3}' <<< "$REPLY")
printf 'Your 3rd argument was %s\n' "$nth"
將兩個欄位(第二個欄位和第三個欄位)儲存在一個變數名中。
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")
printf 'The argument was %s\n' "$nth"
如果您想將第二個和第三個欄位拆分為不同的變數名稱。
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")
printf 'Your 2nd argument was %s\nYour 3rd argument was %s\n' "${nth#* }" "${nth% *}"
- 和
"${nth#* }"
可以"${nth% *}"
用單獨的變數保存。
awk
對此打印所有字段的另一個答案使用$0
,read
這又回到了我的第一個答案read -ra
read -rp "Enter args: "
read -ra fields < <(awk '{\*Do some stuff with fields*\;print $0}' < <(printf '%s' "$REPLY"))
列印所有字段
printf '%s\n' "${fields[@]}"
- 我對這個問題的第一篇文章/答案展示瞭如何循環 bash 數組的字段以及它是如何索引的。