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