在shell脚本中,如何使用变量安全地更改当前目录?

时间:2012-11-01 13:11:49

标签: shell command-line cd

以下shell脚本将当前目录更改为桌面。

v=~/Desktop/
cd $v
pwd # desktop

以下脚本将当前目录更改为主目录,而不是生成错误。

cd $undefined_variable
pwd # home directory
echo $? # 0

如果我拼错了当前新目录的变量,我担心该脚本会删除重要文件。

通常,如何在shell脚本中使用变量安全地更改当前目录?

6 个答案:

答案 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,也应该阅读最后一句话。所以我添加了真正的答案。