我正在尝试编写一个 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
:
#!/bin/bash
dirs="$1"
for dir in $dirs
do
echo $dir
done
父 shell,调用者bash show_files.sh *
,扩展了*
为你。
在您的脚本中,您需要使用:
for dir in "$@"
do
echo "$dir"
done
双引号确保正确处理文件名中的多个空格等。
See also How to iterate over arguments in a bash shell script https://stackoverflow.com/questions/255898/how-to-iterate-over-arguments-in-bash-script.
可能令人困惑的附录
如果您确实确定要获取脚本来扩展*
,你必须确保*
传递给脚本(用引号引起来,如其他答案),然后确保它在处理中的正确位置展开(这并不简单)。那时,我会使用数组。
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 ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)