Array Bashスクリプトの値を印刷する

Array Bashスクリプトの値を印刷する

私のファイルにはThreadout.txt次の内容が含まれています。Thread 1/1/25/100

val1=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $1}')  
val2=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $2}')    
val3=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $3}')  
val4=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $4}')

for((i=1;i<5;i++))  
do  
  val[i]=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $[i]}')  
  echo $val[i] 
done

この配列を試しましたが、1 1 25 100値などの正しい結果を提供しません。エラーがありますか?

ベストアンサー1

コードにはいくつかの問題があります。

  • 覚えておくべき最初の重要な点は、awkプログラムが一重引用符で囲まれているため(推奨)、シェルパラメータ拡張が発生せず、ステートメントがprint $[i]機能しないことです。これを見てStackOverflowの詳細Q&Aawkプログラムでシェルパラメータを使用する方法について説明します。
  • ただし、()変数awkに番号が格納されているフィールドではなく、アドレスが割り当てられます。awkn$n$[n]
  • val1変数を割り当てますval4が、実際には使用しないため、スクリプト例の最初の部分では何もしません。
  • ${val[i]}最後に、配列変数を逆参照するには、notを宣言する必要があります$val[i](これにより、変数の内容$val(空の文字列)と固定文字列が印刷されます[i])。

awk繰り返し呼び出して(私が知っている限り)、フィールド区切り文字としてのみ使用したThread場合、入力例の主な問題を解決できないなど、いくつかの非効率性があります。/

これらの問題を解決するには、例の関連値にスペースが含まれていないため、次のことを試してください。

#!/bin/bash

val=( $(awk '/^Thread/{n=split($2,a,/\//); for (i=1;i<=n;i++) printf("%s%s",a[i],OFS)}' Threadout.txt) )

for i in ${!val[@]}
do
    echo "${val[i]}"
done
  • この呼び出しは、配列内の部分である行のawk2番目の「フィールド」を分割し、配列内のすべての項目を(デフォルトは空白)で区切って印刷します。Thread 1/1/25/1001/1/25/100/aOFS
  • シェルスクリプトはスペースで区切られたトークンのリストなので、awkステートメントを介して各トークンを配列変数に割り当ててこのプログラムの出力を取得します。valval=( ... )
  • 次に配列インデックスを繰り返し、配列値を印刷します。

より多くのbash配列を読みたいかもしれません。GNU BashリファレンスマニュアルまたはGreyCat&Lhunathのバッシュガイド。ぜひご覧ください。住宅検査シェルスクリプトをデバッグします。

おすすめ記事