シェル 配列要素の値を変数に保存する

シェル 配列要素の値を変数に保存する

あるフォルダーから別のフォルダーにファイルをコピーする必要があります。ここで、コピー元とコピー先の情報はテキスト ファイルにあります。

ファイルの内容: res.txt

/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable-hdpi/logo_splash.png=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png

ここでは、区切り文字「=」を使用して文字列を分割し、それぞれの変数に割り当てようとしています。また、コピー コマンドをトリガーする必要があります。

上記を実現するために、文字列を配列に分割し、配列のインデックス要素の値をローカル変数に割り当てようとしています。

lines=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable-hdpi/logo_splash.png=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png
SOURCE=""
DEST=""
echo $lines | awk '{split($0,numbers,"=")} END {
for(n in numbers){
   if (n == 1) { 
      SOURCE = ${numbers[1]}
   }
   else if (n == 2) {
      DEST= ${numbers[2]}
   }
}}'
echo ${numbers[1]}
echo ${numbers[2]}

エラーが発生しています

awk: {split($0,numbers,"=")} END {for(n in numbers){ SOURCE = ${numbers[1]}}
awk:                                                           ^ syntax error

そしてechoの場合、出力は次のようになります

+ echo

+ echo

@Gombai Sandor、ご提案のとおり上記を変更したところ、動作しました。

SOURCE=$(echo $lines | awk -F= '{print $1}')
echo "source is " $SOURCE
DESTINATION=$(echo $lines | awk -F= '{print $2}')
echo "destination is " $DESTINATION

答え1

シェルの構文をawkのコードに混ぜていますif [...] ... elif [...] ... fi。awkは

if (...) {
   ...
} else if (...) {
   ...
}

この文脈では。

さらに、awkの配列がawkの親シェルに表示されることを期待します。

echo ${numbers[1]}
echo ${numbers[2]}

これは起こりません。awk で文字列を記述し、その出力をシェル内で解析すると、awk (または他のプログラム) は呼び出し環境を壊しません。

構文エラーが示されている場所は、別の組み合わせです。

${numbers[1]}

awk コード内の bash 配列要素参照です (awk に対して何らかの意味を持ちますが、これを強制することはお勧めしません)。

ここでどのように解決したいのか、なぜうまくいかないのかを説明すると少し長くなるので、タスクが正確に何なのかを説明してヒントを求めることをお勧めします。しかし、まず第一に、シェル (およびその言語) とその中で実行される awk (およびその言語) は別のものであることを理解する必要があります。これらには類似した要素がありますが、それは類似点にすぎません。

文字列が 1 つの文字でつながっている場合、文字列を 2 つの部分に分割するのは非常に簡単で、awk は必要ありません。cut は基本的な分割プログラムです。

SOURCE=$(echo $lines | cut -f1 -d=)

入力のフィールドが=で区切られている最初のフィールドをSOURCEに入れます。カット 時々、次のようなコードに遭遇することがあります。

SOURCE=$(echo $lines | awk -F= '{print $1}')

同じです。DEST は、2 番目のフィールドをターゲットにして、両方の方法で同様に割り当てることができます。

関連情報