一种选择是将目录(小心地)更改为子目录:
if [[ -d "$var" ]] ; then
if [ "$(ls -A $var)" ]; then
(cd "$var"; exec ./validate $(ls))
fi
fi
外括号启动一个新的 shell,因此该cd
命令不会影响主 shell。用脚本exec
(新副本)替换原始外壳。validate
使用$(...)
而不是反引号是明智的。一般来说,当变量名引用可能包含空格的文件名时,用双引号将变量名括起来是明智的(但见下文)。将$(ls)
列出目录中的文件。
ls
如果任何文件名或目录名包含空格,天堂会帮助您执行命令;您可能应该改用*
glob 扩展。请注意,包含名称为的单个文件的目录-n
会触发脚本中的语法错误。
勘误
正如Jens在评论中指出的,shell 脚本 ( validate
) 的位置必须在您下降目录层次结构时进行调整。最简单的机制是将脚本放在您的 PATH 上,这样您就可以编写exec validate
甚至exec $0
代替exec ./validate
. 如果做不到这一点,您需要调整值$0
— 假设您的 shell$0
作为相对路径离开并且不会将其转换为绝对路径。因此,代码片段的修订版本可能是:
# For validate on PATH or absolute name in $0
if [[ -d "$var" ]] ; then
if [ "$(ls -A $var)" ]; then
(cd "$var"; exec $0 $(ls))
fi
fi
或者:
# For validate not on PATH and relative name in $0
if [[ -d "$var" ]] ; then
if [ "$(ls -A $var)" ]; then
(cd "$var"; exec ../$0 $(ls))
fi
fi