1

ここで見つけたものに従って、特定のパターンのファイルのリストを配列に分割しようとしました。ただし、文字列は分割されません (空行は読みやすくするためです)。

bash-3.2$ files=jfn240_463.o*
bash-3.2$ echo $files
jfn240_463.o9017306 jfn240_463.o9075989 jfn240_463.o9281439 jfn240_463.o9287196

bash-3.2$ IFS=' ' read -ra ll <<< $files
bash-3.2$ echo $ll
jfn240_463.o9017306 jfn240_463.o9075989 jfn240_463.o9281439 jfn240_463.o9287196

bash-3.2$ IFS=' ' read -ra ll <<< "$files"
bash-3.2$ echo $ll
jfn240_463.o9017306 jfn240_463.o9075989 jfn240_463.o9281439 jfn240_463.o9287196

bash-3.2$ echo ${ll[@]}
jfn240_463.o9017306 jfn240_463.o9075989 jfn240_463.o9281439 jfn240_463.o9287196

bash-3.2$ echo ${ll[1]}

bash-3.2$ 

配列を取得できると確信していたのに、取得しないのはなぜですか?

編集:

代わりに使用しようとしましたがfind、あまり成功しませんでした。

bash-3.2$ files=$(find jfn240_463.o*)
bash-3.2$ echo ${files[0]}
jfn240_463.o9017306 jfn240_463.o9075989 jfn240_463.o9281439 jfn240_463.o9287196
bash-3.2$ 
bash-3.2$ IFS=' ' read -ra ll <<< $files
bash-3.2$ echo ${ll[@]}
jfn240_463.o9017306
bash-3.2$ 
4

2 に答える 2

0

Ignacio Vazquez-Abramsは、次のように定義すると、正確に正しい問題を抱えています。

$ files=jfn240_463.o*

シェルは(「パス名展開」)を展開しません。*あなたが書くとき:

$ echo $files

シェル展開し*ます。の実際の値を確認するには$files、次のように記述する必要があります。

$ echo "$files"
jfn240_463.o*

その$filesため、スペースはありません。

にも同じことが当てはまると思われるかもしれませんが、bash はと<<<を区別しないことがわかりました。たとえば、次のように入力すると、これを確認できます。<<<$files<<<"$files"<<<

$ cat <<<jfn240_463.o*
jfn240_463.o*

(実際には、 と の間には小さな違いが<<<$filesあります。bash は、こ​​の場合、 に<<<"$files"続く単語に対してパラメーター展開、コマンド展開、および算術展開を実行します。単語が引用符で囲まれていない場合は、単語分割も実行します。ただし、単語分割の後が終了すると, 単語は再び結合され, 単一のスペースで区切られます. その結果, 引用されていない場合, 空白のすべてのシーケンスは単一のスペースに縮小されます.が空白以外に変更された場合に表示されます。)<<<$files$IFS

Ignacio Vasquez-Abrams が示唆するように、さまざまな回避策が考えられますが、最も簡単なのは配列を直接設定することです。

ll=(jfn240_463.o*)

(この構文では、bashパス名の展開を実行します。)

ただし、ファイル名に空白が含まれていると失敗します。ファイル名に改行が含まれていない場合の別の簡単な解決策 (bash を使用) は、mapfile を使用することです。

mapfile -t ll < <(ls jfn240_463.o*)

または、bash 組み込みの printf を使用する場合:

mapfile -t ll < <(printf "%s\n" jfn240_463.o*)

\0ファイル名に任意の文字が含まれている可能性がある場合にこれを機能させるのは決して簡単ではありません (ファイル名に表示できないと以外/)。

于 2013-08-07T17:42:51.377 に答える