私のコード
FOO="aaa;bbb;ccc"
echo ${FOO##*;} # Result: ccc
echo ${FOO%%;*} # Result: aaa
var FOOから「bbb」を取得するには?
echo ${FOO???*} # Result: bbb
ありがとうございました
私のコード
FOO="aaa;bbb;ccc"
echo ${FOO##*;} # Result: ccc
echo ${FOO%%;*} # Result: aaa
var FOOから「bbb」を取得するには?
echo ${FOO???*} # Result: bbb
ありがとうございました
そのための明示的な演算子はありません。さらに、これらの演算子をネストすることはできません (ネストされたシェル パラメータの展開を参照) 。
したがって、ジョブには一時変数を使用する必要があります。
FOO="aaa;bbb;ccc"
tmp=${FOO%;*}
tmp=${tmp#*;}
echo $tmp
または、配列に変換する必要があります。
アーカイブ用に編集しました、コメントありがとうございます。
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
これは正確には一般化できませんが、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
別の方法。$FOO を定位置パラメーターに割り当てます。
IFS=';'
set -- $FOO
echo "$2"