以下 shell 脚本将当前目录更改为桌面。
v=~/Desktop/
cd $v
pwd # desktop
以下脚本将当前目录更改为主目录,而不是生成错误。
cd $undefined_variable
pwd # home directory
echo $? # 0
如果我拼错了新当前目录的变量,我担心脚本会删除重要文件。
一般来说,你如何在 shell 脚本中使用变量安全地更改当前目录?
以下 shell 脚本将当前目录更改为桌面。
v=~/Desktop/
cd $v
pwd # desktop
以下脚本将当前目录更改为主目录,而不是生成错误。
cd $undefined_variable
pwd # home directory
echo $? # 0
如果我拼错了新当前目录的变量,我担心脚本会删除重要文件。
一般来说,你如何在 shell 脚本中使用变量安全地更改当前目录?
采用:
cd ${variable:?}
如果 $variable 未定义或为空,则 bash 将抛出错误并退出。它就像set -u
选项一样,但不是通过文件全局的。
您可以使用test -d
条件(检查指定的变量是否为目录),即
if [[ -d $undefined_variable ]]
then
cd $undefined_variable
echo "This will not be printed if $undefined_variable is not defined"
fi
另请参阅此处了解更多测试选项...
每次展开未定义的变量时,您都可以set -u
退出并出现错误。bash
Bourne Shell 有一个构造来用一个值代替未定义的变量, ${varname-subtitution}
。如果变量未定义,您可以使用它来拥有一个安全的后备目录:
cd "${undefined-/tmp/backupdir}"
如果有一个名为 的变量undefined
,它的值被替换,否则/tmp/backupdir
被替换。
请注意,我还将变量扩展放在双引号中。这用于防止对包含空格的字符串进行分词(在 Windows 目录中非常常见)。这样,它甚至适用于带有空格的目录。
有关所有 shell 替换结构的详细信息(POSIX shell 还有七个),请阅读您的 shell 手册的参数替换部分。
您必须编写一个包装器(这在 bash 中工作):
cd() {
if [ $# -ne 1 ] ;then
echo "cd need exactly 1 argument" >&2
return 2
fi
builtin cd "$1"
}
是的,如果你不带参数输入,那是 shell ,cd
它会跳转到主目录。您可以在cd
命令之前检查 null 或空的变量。
检查类似(只有在 targetDir 不为空时才调用 cd):
test -z "$targetDir" || cd $targetDir
检查类似(只有在 targetDir 确实存在时才调用 cd):
test -d "$targetDir" && cd $targetDir
注意:感谢-1,也应该阅读最后一句话。所以我添加了真正的答案。