web-dev-qa-db-ja.com

改行で区切られた1つの配列要素を複数の要素を持つ新しい配列にマップする方法

パス/home/myUsername/.local/share/nemo/scripts/Folder with spaces/のNemoで4つのファイルを選択します。 Nemoは、ファイルパスを環境変数NEMO_SCRIPT_SELECTED_FILE_PATHSに保存します。

(以下のglenn jackmanからの回答でわかるように、NEMO_SCRIPT_SELECTED_FILE_PATHSには改行で区切られたファイルパスのリストが含まれています。)

なんで「うん!」すべてのファイルパス行の後に印刷されませんか?どうすればそれを達成できますか? (このファイルパスのリストは配列であると最初は思っていたので、この質問はおそらく苛立たしいものですが、明らかにそうではありません。)

[〜#〜] script [〜#〜]

#!/bin/bash

for i in "${NEMO_SCRIPT_SELECTED_FILE_PATHS[@]}"
do
    echo "$i"
    echo "Yeah!"
done

[〜#〜] output [〜#〜]

/home/myUsername/.local/share/nemo/scripts/Folder with spaces/script1
/home/myUsername/.local/share/nemo/scripts/Folder with spaces/script2
/home/myUsername/.local/share/nemo/scripts/Folder with spaces/script3
/home/myUsername/.local/share/nemo/scripts/Folder with spaces/script4

Yeah!
4
stackunderflow

仮定:

  • 環境変数$NEMO_SCRIPT_SELECTED_FILE_PATHSはどういうわけか、nemoによって魔法のように設定されています。
  • ファイル名の改行で区切られたリストが含まれています。

次のように解析してbash配列にすることができます。

$ NEMO_SCRIPT_SELECTED_FILE_PATHS="file one
file two
file three"

$ mapfile -t files <<<"$NEMO_SCRIPT_SELECTED_FILE_PATHS"

$ echo ${#files[@]}
3

$ printf ">>%s\n" "${files[@]}"
>>file one
>>file two
>>file three

mapfileは、標準入力を読み取り、改行で分割し、名前付き配列に行を格納するbash組み込みコマンドです。

ファイル名のいずれかに改行(正当なファイル名文字)が含まれている場合、これは壊れます。

8
glenn jackman