-1
#/bin/sh
INPUT_ETH="eth0,eth1,eth2,eth3"
i=0
for eth in $(echo $INPUT_ETH | tr "," "\n")
do

 eth_$i=$eth

 echo "$eth_$i"

i=`expr $i + 1`

if [ $eth_$i = $BLA_BLA]

  then;
       ..............
  fi
      done   

*sh split.sh* *

split.sh: eth_0: コマンドが見つかりません

split.sh: eth_1: コマンドが見つかりません

split.sh: eth_2: コマンドが見つかりません

split.sh: eth_3: コマンドが見つかりません

最終出力は .. 変数 "eth_0" で、文字列値は eth_1 と同じように "eth0" にする必要があります....eth_2 など..etc... この後、この変数 eth_0、eth_1 などでループを作成したい

4

4 に答える 4

1

bash実際に使用していて、以下に制限されていない場合、これは William Pursell の回答の拡張ですsh

#!/bin/bash

INPUT_ETH=(eth0 eth1 eth2 eth3)
for eth in ${INPUT_ETH[@]}
do
    echo "$eth"


    if [[ $eth = $BLA_BLA ]]
    then;
       ..............
    fi
done

実際の配列を使用し、動的変数名でそれらをシミュレートしようとしないでください。

本当に必要な場合bashは、コマンドも提供します。これは、任意のコードを実行できないため、declareより安全です。パラメーター展開を実行し、変数の値を設定するだけです。eval

declare "eth_$i=$eth"
于 2013-02-07T13:33:56.517 に答える
0

割り当てにスペースを含めることはできません。また、名前に変数を使用することもできませんeval

eth_$i = $eth

次のように記述する必要があります。

eval eth_$i=$eth

Bash スクリプト変数の宣言 - コマンドが見つかりませんを参照してください。

2番目の質問に関しては、次のことができます。

if eval test $eth_$i = blah; then

または(また、さらに空白が必要です):

if eval [ $eth_$i = blah ]; then

ちなみに、配列の使用については、chepner と glenn jackman の両方が正しいです。私はさらに一歩進んで、おそらくこれをまったく行うべきではないと言います. 作成しているこれらの変数にアクセスしたいときはいつでも、代わりに元の文字列を反復処理してください。

于 2013-02-07T11:42:08.193 に答える
0

他の人が言ったように、リストをループするだけです。

これを行う昔ながらの方法は、 を使用することIFSです。

#/bin/sh
INPUT_ETH="eth0,eth1,eth2,eth3"
OFS=$IFS IFS=,
set -- $INPUT_ETH
IFS=$OFS
BLA_BLA=eth2
for eth in $*; do
    if [ $eth = $BLA_BLA ] ; then
        echo "$eth OK - now work."
    else
        echo "$eth ignored"
    fi
done

出力:

eth0 ignored
eth1 ignored
eth2 OK - now work.
eth3 ignored
于 2013-02-07T18:32:31.807 に答える
0

bash の場合:

文字列を配列に分割します

INPUT_ETH="eth0,eth1,eth2,eth3"
IFS=, read -a eth <<< "$INPUT_ETH"
for (( i=0; i<${#eth[@]}; i++ )); do echo "$i - ${eth[$i]}"; done

出力

0 - eth0
1 - eth1
2 - eth2
3 - eth3

動的変数名を作成するには、次を使用しますdeclare

declare eth_$i=$eth

しかし、動的な変数名を使用すると、作業がより困難になる傾向があります。配列を使用してください。それが得意です。

于 2013-02-07T13:55:58.750 に答える