Bourne / POSIXのようなシェルにはsplit + glob演算子があり、リストコンテキストでパラメーター展開($var
、$-
...)、コマンド置換($(...)
)、または算術展開($((...))
)を引用符で囲まずに呼び出すたびに呼び出されます。
実際、のfor name in ${array[@]}
代わりに誤って呼び出したのですfor name in "${array[@]}"
。(実際、そのような演算子を誤って呼び出すと、多くのバグやセキュリティの脆弱性の原因になることに注意してください)。
その演算子を用いて構成され$IFS
、特殊なパラメータと、(どのような(しかしそのスペースを用心、タブや改行が特別な治療を受ける)に分割する文字伝えるために)-f
無効にするオプションを(set -f
)または有効(set +f
)glob
の部分。
また、S
in $IFS
は元々(元々のBourneシェルで$IFS
)Separatorでしたが、POSIXシェルでは、inの文字は区切り文字またはターミネータ$IFS
として見るべきです(例については以下を参照)。
分割するには_
:
string='var1_var2_var3'
IFS=_ # delimit on _
set -f # disable the glob part
array=($string) # invoke the split+glob operator
for i in "${array[@]}"; do # loop over the array elements.
separatorとdelimiterの違いを確認するには、次を試してください。
string='var1_var2_'
それはに分割しないだろうvar1
とvar2
だけ(余分な空要素)。
したがって、JavaScriptのようsplit()
にするには、追加の手順が必要になります。
string='var1_var2_var3'
IFS=_ # delimit on _
set -f # disable the glob part
temp=${string}_ # add an extra delimiter
array=($temp) # invoke the split+glob operator
(JavaScriptのように、空$string
を1(0ではなく)要素に分割することに注意してくださいsplit()
)。
特別処理タブ、スペースおよび改行受信を表示するには、以下を比較してください。
IFS=' '; string=' var1 var2 '
(ここで、あなたが得るvar1
とvar2
して)
IFS='_'; string='_var1__var2__'
あなたが取得する場所:''
、var1
、''
、var2
、''
。
注意zsh
シェルが暗黙的にしない限りでそのようなことスプリット+グロブ演算子呼び出しませんsh
かksh
エミュレーションを。そこで、明示的に呼び出す必要があります。$=string
分割部分、$~string
グロブ部分($=~string
両方)、および区切り記号を指定できる分割演算子もあります。
array=(${(s:_:)string})
または空の要素を保持するには:
array=("${(@s:_:)string}")
そこことに注意してくださいs
するためのものである分割、ない区切り(とも$IFS
、既知のPOSIXの非準拠zsh
)。JavaScriptとは異なりsplit()
、空の文字列が0(1ではなく)要素に分割されます。
$IFS
-splittingとの顕著な違いは${(s:abc:)string}
、abc
文字列で分割するのに対し、with IFS=abc
ではa
、b
またはで分割することc
です。
とzsh
とksh93
、スペース、タブや改行を受けることを特別な治療は、それらを倍増することによって除去することができます$IFS
。
歴史的なメモとして、Bourneシェル(祖先または最新のPOSIXシェル)は常に空の要素を削除しました。また、デフォルト以外の値である$ @の分割と展開に関連するいくつかのバグがありました$IFS
。たとえば、IFS=_; set -f; set -- $@
と同等ではありませんIFS=_; set -f; set -- $1 $2 $3...
。
正規表現での分割
ここでsplit()
、正規表現で分割できるJavaScriptに近いものについては、外部ユーティリティに依存する必要があります。
POSIXツールチェストにawk
は、拡張正規表現でsplit
分割できる演算子があります(これらは、JavaScriptでサポートされているPerlのような正規表現のサブセットです。)
split() {
awk -v q="'" '
function quote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
BEGIN {
n = split(ARGV[1], a, ARGV[2])
for (i = 1; i <= n; i++) printf " %s", quote(a[i])
exit
}' "$@"
}
string=a__b_+c
eval "array=($(split "$string" '[_+]+'))"
zsh
シェルは、(その中のPerl互換の正規表現のサポート組み込み有するzsh/pcre
モジュール)が、可能が比較的面倒であるが、それは、文字列を分割するために使用して。
shell
を使用して、何をbash
することができますIFS='_' read -a array <<< "${string}"