bash - 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
,它将提供正确的文件名和空格?
解决方案
我假设您的文件名不包含换行符。
# 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 三.mp3- -ftest one.mp3- -ftest two.mp3-
推荐阅读
- javascript - 如何在多个html页面上声明一个变量
- tailwind-css - 如何在 tailwindcss 表中隐藏小型设备上的列?
- flutter - 我如何导航图像(包括图像上的文本)?
- scala - Scala 运行时错误:org.apache.spark.SparkException:无法执行用户定义的函数(Tokenizer$$Lambda$../..: (string) => array
) - amazon-web-services - AWS Cloud HSM 和 KMS 之间有什么区别?
- javascript - 是否可以使用 JavaScript 将输入值中的文本保存在 html 上并写入本地 txt 文件?
- javascript - 如何访问 Promise 的属性