2016-10-31 2 views
0
pattern="::a::b::" 
oldIFS=$IFS 
IFS="::" 
read -r -a extractees <<< $pattern 
IFS=$oldIFS 

これはbashの - 空の値

{"a","b"} 

につながるしかし、私はインデックスを維持する必要があるので、私は場合は、比較のために(

{"","a","b",""} 

をしたいWITH配列に分割した文字列I {"a","b"}を望んでいた、私は"a::b"を書かれているでしょう。

なぜ?これらの要素は緯度であるため、 ER(異なる区切り文字に)再度分割し、空""値は、空のリストをもたらすはずです。

どうすればよいですか?

+0

@Cyrus "' {""、 "b"、 "}}' - 投稿自体に書いたとおりです。 '' :: ''デリミタ*と*、それはインデックスを変更した場合、{ ""、 "A"、 ""、 "B" は、 ""} ''意味をなさない。 – User1291

答えて

1

ませフィールドセパレータは、残念ながら長いよりも1つの文字、そう'::' → ':'になることはできません。

それ以外の点の、グロブを明示的に引用符で囲まれていない変数の潜在的なファイル名展開を防ぐためにオフにする必要があります。

set -f # disable globbing 
pattern=":a:b c:" 
oldIFS=$IFS 
IFS=":" 
extractees=($pattern) 
IFS=$oldIFS 

echo "'${extractees[0]}'" 
echo "'${extractees[1]}'" 
echo "'${extractees[2]}'" 
echo "'${extractees[3]}'" 
+0

非上場のパラメータ展開はまた、配列に文字列を分割するための信頼できる方法ではありません。 – chepner

+0

@chepner大丈夫です。 '$ IFS'はすでに設定されているので、引用符で囲まれていない拡張に影響する唯一のものはファイル名のグロブです。ただし、ここでは発生しません。ちょうどBASH 4.3で試しました。正確な理由が分からない場合、このケースは一見文書化されていません。しかし、安全な側にするために、globbingは常に 'set -f'によって明示的に無効にすることができます。編集されました。 – hidefromkgb

+0

@chepner連続した空白文字は、 '$ IFS'がデフォルト値と等しい場合に_only_だけ削除されます。 [Prooflink](http://www.tldp.org/LDP/abs/html/internalvariables.html#IFSH)。 – hidefromkgb