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

在shell脚本中,如何使用变量安全地更改当前目录?,shell,command-line,cd,Shell,Command Line,Cd,下面的shell脚本将当前目录更改为桌面 v=~/Desktop/ cd $v pwd # desktop 以下脚本将当前目录更改为主目录,而不是生成错误 cd $undefined_variable pwd # home directory echo $? # 0 如果我为新的当前目录拼写了一个变量,恐怕脚本会删除重要文件 通常,如何使用shell脚本中的变量安全地更改当前目录?您可以使用test-d条件检查指定的变量是否为目录,即 if [[ -d $undefined_variable

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

v=~/Desktop/
cd $v
pwd # desktop
以下脚本将当前目录更改为主目录,而不是生成错误

cd $undefined_variable
pwd # home directory
echo $? # 0
如果我为新的当前目录拼写了一个变量,恐怕脚本会删除重要文件

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

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

if [[ -d $undefined_variable ]]
then
  cd $undefined_variable
  echo "This will not be printed if $undefined_variable is not defined"
fi
有关更多测试选项,请参见…

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

if [[ -d $undefined_variable ]]
then
  cd $undefined_variable
  echo "This will not be printed if $undefined_variable is not defined"
fi
有关更多测试选项,请参见…

是的,这是shell 如果您键入不带参数的cd,它将跳转到home dir。 您可以在执行cd命令之前检查null或empty变量

仅当targetDir不为空时才调用check like cd:

test -z "$targetDir" || cd $targetDir
仅当targetDir确实存在时才调用check like cd:

test -d "$targetDir" && cd $targetDir
注意:谢谢-1,也应该读最后一句。所以我添加了真正的答案。

是的,这就是shell 如果您键入不带参数的cd,它将跳转到home dir。 您可以在执行cd命令之前检查null或empty变量

仅当targetDir不为空时才调用check like cd:

test -z "$targetDir" || cd $targetDir
仅当targetDir确实存在时才调用check like cd:

test -d "$targetDir" && cd $targetDir
注意:谢谢-1,也应该读最后一句。因此,我添加了真正的答案。

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

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

Bourne shell有一个构造来替换未定义变量的值${varname subtitution}。在变量未定义的情况下,您可以使用它来拥有一个安全的回退目录:

 cd "${undefined-/tmp/backupdir}"
如果存在名为undefined的变量,则替换其值,否则替换/tmp/backupdir

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

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

Bourne shell有一个构造,用于替换未定义变量的值${varname subtitution}。在变量未定义的情况下,您可以使用它来拥有一个安全的回退目录:

 cd "${undefined-/tmp/backupdir}"
如果存在名为undefined的变量,则替换其值,否则替换/tmp/backupdir

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

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

使用:

cd${变量:?}

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

使用:

cd${变量:?}

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

您必须在bash中编写一个包装器:

cd() {
    if [ $# -ne 1 ] ;then
        echo "cd need exactly 1 argument" >&2
        return 2
      fi
    builtin cd "$1"
}
您必须在bash中编写此工作的包装器:

cd() {
    if [ $# -ne 1 ] ;then
        echo "cd need exactly 1 argument" >&2
        return 2
      fi
    builtin cd "$1"
}

您还可以提供错误消息:${variable:?variable is unset或empty}您还可以提供错误消息:${variable:?variable is unset或empty}其他答案也很好,但set-u是最简单的解决方案。谢谢其他答案也很好,但set-u是最简单的解决方案。谢谢谢谢你提供有用的信息!我不知道有一个很酷的特性,比如参数替换。我应该学习更多的shell脚本。感谢提供有用的信息!我不知道有一个很酷的特性,比如参数替换。我应该学习更多的shell脚本。