Bash スクリプト: 後で使用するために awk フィールドを保存する

Bash スクリプト: 後で使用するために awk フィールドを保存する

ユーザーからの入力を読み取り、 を使用してそれをフィールドに分割するスクリプトを書いています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すべてのフィールドを印刷し$0read最初の答えに戻ることです。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 配列のフィールドをループする方法と、それがどのようにインデックス付けされるかを示しています。

関連情報