我正在尝试编写一个bash脚本,该脚本允许用户使用通配符传递目录路径。
例如,
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:
show_files.sh
#!/bin/bash dirs="$1" for dir in $dirs do echo $dir done
父外壳(一个调用)为您bash show_files.sh *扩展了外壳*。
*
在脚本中,您需要使用:
for dir in "$@" do echo "$dir" done
双引号确保正确处理文件名中的多个空格等。
如果您确实确定要扩展该脚本*,则必须确保将*其传递给脚本(如其他答案中所述,用引号引起来),然后确保在正确的位置将其扩展在处理中(这不是小事)。那时,我将使用数组。
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单独提取,则可以使用:
$2
names=( $1 ) for file in "${names[@]}" do echo "$file" done # ... use $2 ...