我正在编写一个脚本,它读取用户的输入并使用 将其划分为字段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 数组的字段以及它是如何索引的。