Bash:在一行上获得一个带有空格的文件名列表(作为参数)?

时间:2018-12-31 16:04:56

标签: bash

说我有这个脚本,test.sh

for ix in "$@"; do
  echo -$ix-;
done

编辑:test.sh只是另一个命令行程序(例如vlc的代表)-因此,我需要它的参数为正确的文件名;我不需要自己修改test.sh

...以及这些文件:

touch "ftest one.mp3"
touch "ftest two.mp3"
touch "ftest three.mp3"

如果执行此操作,我将获得正确的输出:

$ bash test.sh ftest*
-ftest one.mp3-
-ftest three.mp3-
-ftest two.mp3-

现在,我想将这个列表随机化-使用shuf;但是在这种琐碎的情况下,单词被分割了:

$ bash test.sh $(ls ftest* | shuf)
-ftest-
-one.mp3-
-ftest-
-two.mp3-
-ftest-
-three.mp3-

如果我引用子流程部分,那么我会得到一个巨大的字符串-仍然不​​是我想要的:

$ bash test.sh "$(ls ftest* | shuf)"
-ftest two.mp3 ftest one.mp3 ftest three.mp3-

那么,我该如何重写子进程,以便在用作test.sh的参数时,它将提供正确的带空格的文件名?

1 个答案:

答案 0 :(得分:3)

我认为您的文件名不包含换行符。

# read files to array "files"
files=(*.mp3)     

# Output array "files", shuffle, read to array "mixed"
mapfile -t mixed < <(printf '%s\n' "${files[@]}" | shuf)

bash test.sh "${mixed[@]}"

输出(例如):

-ftest three.mp3-
-ftest one.mp3-
-ftest two.mp3-