Bash 在名称中有空格的文件中搜索

Bash 在名称中有空格的文件中搜索,bash,Bash,这来自一个脚本,该脚本在第一个参数中获取一个要搜索的单词,然后在该单词中获取要搜索的文件列表。 例如,我如何运行它:./my_script book* 搜索文件是上面定义的一个函数。 问题是它会跳过名称中有空格的文件。我想这是因为${*:2},那么我应该在里面写什么呢 顺便问一下,我应该在第三行写$file还是$file?按如下方式运行脚本将*放在单引号中,如果文件名中有空格或不可打印的字符,这应该可以解决您的问题 ./my_script book '*' 使用$file比使用$file好使用

这来自一个脚本,该脚本在第一个参数中获取一个要搜索的单词,然后在该单词中获取要搜索的文件列表。 例如,我如何运行它:./my_script book*

搜索文件是上面定义的一个函数。 问题是它会跳过名称中有空格的文件。我想这是因为${*:2},那么我应该在里面写什么呢


顺便问一下,我应该在第三行写$file还是$file?

按如下方式运行脚本将*放在单引号中,如果文件名中有空格或不可打印的字符,这应该可以解决您的问题

./my_script book '*'
使用$file比使用$file好

使用$@quoted而不是unquoted$*,并且确保在使用$file的任何地方都引用它

for file in "${@:2}"; do
    if [[ -f "$file" ]]; then
        search_file "$1" "$file"
    fi
稍微干净一点的方法是使用shift从位置参数集中删除第一个参数,这样您就可以简单地在$@上迭代,而不用使用子字符串展开运算符

first=$1
shift
for file in "$@"; do
    if [[ -f "$file" ]]; do
        search_file "$first" "$file"
    fi

事实上,您可以将for循环缩短为for文件;因为迭代位置参数是默认操作,列表中没有。是否尝试引用$file$文件我想你应该先这么做。@kenorb它不起作用,我试着在你的问题中粘贴搜索文件函数的前几行,如何解析参数?用于${@:2}中的文件;做此外,当您使用变量文件时,请将其与引号一起使用:例如,您的第三行应该是search_file$1$file。有趣的是,你在[[-f$file]]中不需要引号的地方使用了引号。@gniourf_gniourf为什么不需要引号?如果我在不需要的情况下使用引号,它会给出错误的结果吗?我怎么决定呢?我明白了,如果我有一个文件架2,它是在寻找一个文件架文件和一个文件架2。正如你所说,只有当我把$file也放进去时,它才起作用,谢谢。我选择这个答案是因为它改变了我的脚本,而不是你应该使用它的方式。
first=$1
shift
for file in "$@"; do
    if [[ -f "$file" ]]; do
        search_file "$first" "$file"
    fi