ユーザーからの入力を読み取り、 を使用してそれをフィールドに分割するスクリプトを書いていますawk
。 スクリプトの最後にそれらのフィールドの 1 つを使用したいので、それを何らかの変数に保存しようとしていますが、無駄です。
考えられる解決策の 1 つは、入力を保存し、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
? にローカルでした)。
ティア
答え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"
2 番目のフィールドと 3 番目のフィールドを 1 つの変数名に格納します。
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")
printf 'The argument was %s\n' "$nth"
2番目と3番目のフィールドを別の変数名で分割する場合。
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 配列のフィールドをループする方法と、それがどのようにインデックス付けされるかを示しています。