Bash 引用外壳参数展开式

Bash 引用外壳参数展开式,bash,Bash,我有一个简单的Bash函数,它根据路径表达式为我提供一个随机文件: rand(){ls-d“$@”shuf-n1;} 让我编写rand*或rand./Documents/*pdf之类的内容来返回my\u file.txt或/Documents/my\u file.pdf 处理带有空格的文件名时需要引号 现在我想添加一个,例如像${@-./*}(使randdorand./*)。我如何做到这一点,以便用户输入仍然被引用 这将使默认值起作用,但在存在文件或用户输入的空格时失败: rand() { l

我有一个简单的Bash函数,它根据路径表达式为我提供一个随机文件:

rand(){ls-d“$@”shuf-n1;}
让我编写
rand*
rand./Documents/*pdf
之类的内容来返回
my\u file.txt
/Documents/my\u file.pdf
处理带有空格的文件名时需要引号

现在我想添加一个,例如像
${@-./*}
(使
rand
do
rand./*
)。我如何做到这一点,以便用户输入仍然被引用

这将使默认值起作用,但在存在文件或用户输入的空格时失败:

rand() { ls -d ${@-*} | shuf -n 1; }
这将适用于用户输入,但会将文字名称
“*”
作为默认值,而不会找到任何内容:

rand() { ls -d "${@-*}" | shuf -n 1; }
这不是一个有效的替代:

rand() { ls -d ${"@"-*} | shuf -n 1; }

(我在GNUBash版本5上,以防版本之间存在语法差异)

如果
,那么
呢?如果没有用户输入,则不需要将其引用;如果有用户输入,则不需要使用默认值

rand(){
如果($);那么
ls-d“$@”
其他的
ls-d/*
fi | shuf-n1
}
甚至

rand(){
如果(!$);那么
设置--/*
fi
ls-d“$@”shuf-n1
}

请注意,对于带有换行符的文件名(但创建换行符的人值得这样做!),它仍然会中断(正如没有默认值的原始解决方案一样)。

请注意:是的,我知道解析ls输出并不是做任何事情的正确方法,但对于个人使用,我准备接受任何边缘情况:)谢谢,我想这就是路!我知道像这样解析
ls
输出的边缘情况,但实际上我有更大的问题要关心D(此脚本仅在我的计算机上使用)