Bourne / POSIXのようなシェルにはsplit + glob演算子があり、リストコンテキストでパラメーター展開($var、$-...)、コマンド置換($(...))、または算術展開($((...)))を引用符で囲まずに呼び出すたびに呼び出されます。
実際、のfor name in ${array[@]}代わりに誤って呼び出したのですfor name in "${array[@]}"。(実際、そのような演算子を誤って呼び出すと、多くのバグやセキュリティの脆弱性の原因になることに注意してください)。
その演算子を用いて構成され$IFS、特殊なパラメータと、(どのような(しかしそのスペースを用心、タブや改行が特別な治療を受ける)に分割する文字伝えるために)-f無効にするオプションを(set -f)または有効(set +f)globの部分。
また、Sin $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}"