如果bash脚本的条件有什么问题

时间:2018-11-16 16:14:03

标签: linux bash

我安装了装有ZSH的Ubuntu 18.04。我有这个bash脚本,用于检查目录是否存在。

即使我有一个名为“〜/ .config”的目录,该条件始终为负。我似乎无法弄清楚我的代码出了什么问题。

setup.sh

#!/bin/bash

if [ -d "~/.config" ] ; then
  echo "Directory exist"
else
  echo "Does not exist"
fi

使用chmod +x ./setup.sh使文件可执行 输出始终为Does not exist

2 个答案:

答案 0 :(得分:5)

自从您编写了"~/.config"以来,它将被视为原义字符串。要允许~ shell扩展,您需要不加引号:

#!/bin/bash
if [ -d ~/.config ] ; then
  echo "Directory exist"
else
  echo "Does not exist"
fi

Bash Pitfals, 26. echo "~"对此做了很好的解释:

  

26。回声“〜”

     

仅在'〜'不加引号的情况下才适用波浪号扩展。在此示例中,echo向标准输出写入“〜”,而不是用户主目录的路径。

     

引用相对于用户主目录表示的路径参数应使用$ HOME而不是'〜'。例如,考虑$ HOME为“ / home / my photos”的情况。

"~/dir with spaces" # expands to "~/dir with spaces"
~"/dir with spaces" # expands to "~/dir with spaces"
~/"dir with spaces" # expands to "/home/my photos/dir with spaces"
"$HOME/dir with spaces" # expands to "/home/my photos/dir with spaces"`

答案 1 :(得分:2)

在bash中,双引号("...")抑制了全局和相关扩展,例如*~等。

双引号保留shell变量的扩展;单引号('...')同时抑制全局扩展和shell变量扩展。因此,它们分别在不同的上下文中有用。

但是在需要*~等有意义的上下文中,您需要未加引号的表达式。 ...请当心,因为如果不小心,由于膨胀可能会发生意料之外的事情。