1

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

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

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

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

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

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

4

6 回答 6

2

采用:

cd ${variable:?}

如果 $variable 未定义或为空,则 bash 将抛出错误并退出。它就像set -u选项一样,但不是通过文件全局的。

于 2012-11-01T13:30:23.747 回答
1

您可以使用test -d条件(检查指定的变量是否为目录),即

if [[ -d $undefined_variable ]]
then
  cd $undefined_variable
  echo "This will not be printed if $undefined_variable is not defined"
fi

另请参阅此处了解更多测试选项...

于 2012-11-01T13:15:27.773 回答
1

每次展开未定义的变量时,您都可以set -u退出并出现错误。bash

于 2012-11-01T13:17:47.703 回答
1

Bourne Shell 有一个构造来用一个值代替未定义的变量, ${varname-subtitution}。如果变量未定义,您可以使用它来拥有一个安全的后备目录:

 cd "${undefined-/tmp/backupdir}"

如果有一个名为 的变量undefined,它的值被替换,否则/tmp/backupdir被替换。

请注意,我还将变量扩展放在双引号中。这用于防止对包含空格的字符串进行分词(在 Windows 目录中非常常见)。这样,它甚至适用于带有空格的目录。

有关所有 shell 替换结构的详细信息(POSIX shell 还有七个),请阅读您的 shell 手册的参数替换部分。

于 2012-11-01T13:29:51.893 回答
1

您必须编写一个包装器(这在 bash 中工作):

cd() {
    if [ $# -ne 1 ] ;then
        echo "cd need exactly 1 argument" >&2
        return 2
      fi
    builtin cd "$1"
}
于 2012-11-01T13:36:29.207 回答
0


是的,如果你不带参数输入,那是 shell ,cd它会跳转到主目录。您可以在cd命令之前检查 null 或空的变量。

检查类似(只有在 targetDir 不为空时才调用 cd):

test -z "$targetDir" || cd $targetDir

检查类似(只有在 targetDir 确实存在时才调用 cd):

test -d "$targetDir" && cd $targetDir

注意:感谢-1,也应该阅读最后一句话。所以我添加了真正的答案。

于 2012-11-01T13:16:56.180 回答