0

私のコード

FOO="aaa;bbb;ccc"

echo ${FOO##*;} # Result: ccc
echo ${FOO%%;*} # Result: aaa

var FOOから「bbb」を取得するには?

echo ${FOO???*} # Result: bbb

ありがとうございました

4

4 に答える 4

1

そのための明示的な演算子はありません。さらに、これらの演算子をネストすることはできません (ネストされたシェル パラメータの展開を参照) 。

したがって、ジョブには一時変数を使用する必要があります。

FOO="aaa;bbb;ccc"
tmp=${FOO%;*}
tmp=${tmp#*;}
echo $tmp

または、配列に変換する必要があります。

アーカイブ用に編集しました、コメントありがとうございます。

于 2013-03-12T01:18:18.313 に答える
1

jejese's answer に従って、単語分割構造#と単語分割構造を使用できます%

FOO="aaa;bbb;ccc"
split=${FOO%;*}
final=${split#*;}
echo $final

生成:

bbb

またはIFS、セミコロンに設定された bash フィールド区切り変数を使用して、フィールドに基づいて入力を分割することもできます。これはおそらく使用が簡単で、1 行のコードを使用して 2 番目のフィールドの値を取得できます。

FOO="aaa;bbb;ccc"
IFS=";" read field1 field2 field3 <<< "$FOO"
echo $field1 $field2 $field3

生成:

aaa bbb ccc
于 2013-03-12T01:45:25.590 に答える
0

これは正確には一般化できませんが、3 つの;区切りフィールドの中間を抽出するには、次のようにします。

$ shopt -s extglob
$ FOO=aaa;bbb;ccc
$ echo ${FOO//+(${FOO##*;}|${FOO%%;*}|;)}
bbb

ステップに分割すると、その仕組みを簡単に確認できます。

$ C=${FOO##*;}     # ccc
$ A=${FOO%%;*}     # aaa
$ echo ${FOO//+($A|$C|;)}  # Removes every occurance of $A, $C, or ; from FOO
于 2013-03-12T01:49:22.773 に答える
0

別の方法。$FOO を定位置パラメーターに割り当てます。

IFS=';'
set -- $FOO
echo  "$2"
于 2013-03-12T08:26:00.243 に答える