如何将通配符parameter passing给bash文件

我试图编写一个bash脚本,允许用户使用通配符传递目录path。

例如,

bash show_files.sh * 

在这个目录下执行

 drw-r--r-- 2 root root 4.0K Sep 18 11:33 dir_a -rw-r--r-- 1 root root 223 Sep 18 11:33 file_b.txt -rw-rw-r-- 1 root root 106 Oct 18 15:48 file_c.sql 

会输出:

 dir_a file_b.txt file_c.sql 

它现在的方式是输出:

 dir_a 

show_files.sh内容:

 #!/bin/bash dirs="$1" for dir in $dirs do echo $dir done 

Solutions Collecting From Web of "如何将通配符parameter passing给bash文件"

父shell,一个调用bash show_files.sh * ,为你扩展*

在你的脚本中,你需要使用:

 for dir in "$@" do echo "$dir" done 

双引号确保文件名中的多个空格等被正确处理。

另请参见如何遍历bash shell脚本中的参数 。


可能令人困惑的附录

如果你真的确定你想让脚本扩展* ,你必须确保*被传递给脚本(用引号括起来,就像在其他答案中一样),然后确保它在在处理中的正确点(这不是微不足道的)。 在这一点上,我会使用一个数组。

 names=( $@ ) for file in "${names[@]}" do echo "$file" done 

我不经常使用$@没有双引号,但这是一次或多或少是正确的事情。 棘手的部分是,它不会很好地处理空格的通配符。

考虑:

 $ > "double space.c" $ > "double space.h" $ echo double\ \ space.? double space.c double space.h $ 

这工作正常。 但是试着把它作为一个通配符传递给脚本,好吧,我们只是说在这一点上会变得棘手。

如果你想单独提取$2 ,那么你可以使用:

 names=( $1 ) for file in "${names[@]}" do echo "$file" done # ... use $2 ... 

引用通配符:

 bash show_files.sh '*' 

或者让你的脚本接受一个参数列表,而不只是一个:

 for dir in "$@" do echo "$dir" done 

为了保持其自身包含空白的元素的特殊能力,最好直接在"$@'上迭代而不是分配给另一个变量。