说我有这个脚本,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
的参数时,它将提供正确的带空格的文件名?
答案 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-