私はユーザーの入力を読み、それを使用してフィールドに分割するスクリプトを書いています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配列はインデックス0から始まることを覚えておいてください。
入力を繰り返すことができます。
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つのフィールド(2番目と3番目のフィールド)を保存します。
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配列のフィールドを繰り返す方法とインデックス付け方法を示しました。