2017-06-02 18 views
0

私はBourne Shellを使用しています。私の以下の理解が正しいかどうか確認する必要がありますか?

$ echo $SHELL 
/bin/bash 

$ VAR="NJ:NY:PA" <-- declare an array with semicolon as separator? 

$ echo ${VAR#*} <-- show entire array without separator? 
NJ:NY:PA 

$ echo ${VAR#*:*} <-- show array after first separator? 
NY:PA 

$ echo ${VAR#*:*:*} <-- show string after two separator 
PA 
+1

いいえ、それはありません。また、あなたの書く能力を与える

# read contents of string VAR into an array of states IFS=: read -r -a states <<<"$VAR" echo "${states[0]}" # will echo NJ echo "${states[1]}" # will echo NY echo "${#states[@]}" # count states; will emit 3 

...。あなたのコードには配列がありません。 – melpomene

+0

したがって、VARは文字列として扱われ、echoは単純にコロン(:)をセパレータとして扱い、部分文字列を出力します – oradbanj

+0

細かいマニュアルをお読みください:https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter - 拡張 – melpomene

答えて

2

${var#pattern}は、文字列の先頭から除去patternための最短マッチと$varの値に展開parameter expansionです。

したがって、${VAR#*:}は、すべてを削除して最初の:まで含めます。 ${VAR#*:*:}は、2番目の:までのすべてを削除します。質問に与えられた展開の末に

末尾* sが任意の使用を持っていない、と避けるべきである。代わりに${var#*:*:}${var#*:*:*}を使用するには、一切理由はありません - これらはテキストの最小量を一致させるため、可能であり、*は0文字に拡張できます。最後の*は一致して何も削除しません。何が本当にがしたいことは配列の場合


は、あなたの代わりに本当のアレイを使用して検討するかもしれません。

printf ' - %s\n' "${states[@]}" # put *all* state names into an argument list 
関連する問題