7

IFS を使用して文字列を配列に変換するのに問題があります。これが私の文字列として持っているものです:

"Jun01 Jun02 Jun03 Jun04 Jun05 ..." #in that format, separated by spaces

そして、ここに私が試したコードがあります:

IFS=" " #set it to space character
DATES_ARRAY=($DATES_STRING) #from above
echo ${DATES_ARRAY[0]} #output is empty

ただし、IFS行を削除すると機能します。しかし、数行を使用してデフォルトのASCII値を出力したところ、「スペース」文字を意味する「32」が得られました。OCD プログラマーなので、安全のために自分で設定したいのですが...どのようにアプリオリにプリセットされるのかわかりません!

では、IFS をスペースに手動で設定しようとしてもうまくいかないのはなぜですか?

4

3 に答える 3

12

動作しますが、デフォルトでスペースが IFS にあることが保証されているため、とにかく不要です。手動で設定しないでください。これを行うと、問題が発生する可能性があります。

基本的に、Bash では単語分割を使用しないでください。非常に慎重に使用する場合、POSIX sh に制限されている場合は、弾丸を噛んで使用する必要がある場合があります。IFS を設定する場合は、何らかの効果がある数少ないコマンドの 1 つの環境に設定するか、せいぜい関数に対してローカルに設定します。

これを使用する必要はないので、すべてを説明することはしません:

$ printf -v str '%s ' Jun{01..10}
$ set -f
$ IFS=' ' declare -a 'arr=($str)'
$ declare -p arr
declare -a arr='([0]="Jun01" [1]="Jun02" [2]="Jun03" [3]="Jun04" [4]="Jun05" [5]="Jun06" [6]="Jun07" [7]="Jun08" [8]="Jun09" [9]="Jun10")'

IFS はここで冗長にスペースに設定され、機能することを示しています。

おそらく、文字列から配列に移動する最も正しい方法は、 を使用することreadです。ここに多くの例があります。

標準的な方法は次のとおりです。

read -ra arr <<<"$str"

ここで、IFS はread、空白以外の場合に区切り文字として機能するように環境でオプションで設定されます。

于 2012-07-10T17:44:22.950 に答える
2

デフォルト$IFSでは、タブや改行を含む空白をトークンの区切り文字として使用します。

これを試して:

echo "$IFS" | cat -vte

を変更していない場合$IFS、出力は次のようになります。

 ^I$
$

それはスペースであり、その後に単一のタブが続きます: ^I、および改行 -cat改行を として出力するメモ$

したがって、スクリプトの抜粋は、に触れなくても機能するはず$IFSです。

于 2012-07-10T17:22:28.553 に答える