如何在if-then语句中正确使用比较运算符

时间:2015-05-12 04:04:09

标签: shell unix

对来自shell脚本中调用的查询的输出执行检查/测试的最佳方法是什么?

例如, 我有一个执行此查询的变量:

export CHK=`psql -h localhost -p 5432 -U foo foobar --tuples-only -c "SELECT 1 AS result FROM pg_database WHERE datname='foo_bar_1234'";`

它将返回1 =存在或空字符串=不存在。

我尝试了这段代码,但它不能像预期的那样工作 每次DB does not exist即使值为空字符串。我甚至用"1"尝试了它,结果仍然相同。

if  [ "$CHCK" = 1 ]; then
        echo "DB exists."
        exit  1
     else
        echo "DB does not exist."
fi

如何更正此问题和/或检查此问题的更好方法是什么?

1 个答案:

答案 0 :(得分:2)

从您的评论中可以看出1的输出可能被空格包围,因此一种解决方案是首先使用read修剪前导空格和尾随空格:

#!/usr/bin/env bash

export CHCK=$(psql -h localhost -p 5432 -U foo foobar --tuples-only -c "SELECT 1 AS result FROM pg_database WHERE datname='foo_bar_1234'")

# Remove leading and trailing whitespace from the value.
read -r CHCK <<<"$CHCK"

# With whitespace trimmed, comparison with string '1' should now work as intended.
if  [[ $CHCK == '1' ]]; then
  echo "DB exists."
  exit  1
else
  echo "DB does not exist."
fi
  • 请注意,除非您确实需要将$CHCK添加到环境,以便进程可以看到它,否则无需使用export
  • read -r CHCK <<<"$CHCK"利用了以下事实:默认情况下read在读入单个变量时会从输入中删除前导和尾随空格:
    • -r可确保输入中的\个实例保持不变 - 这里并非绝对必要,但总的来说是好的做法。
    • <<<是一个所谓的bash here-string,它只是通过 stdin 将其参数发送到手边的命令 - 这是{{1}从...读取。 read是符合POSIX标准here-documents
    • 的单行替代方案

另一个选择是使用<<<的正则表达式匹配运算符bash,它绕过了首先修剪空格的需要:

=~

不那么严格,如果字符串中存在if [[ $CHCK =~ ^[[:space:]]*1[[:space:]]*$ ]]; then # ... 任何地方就足够了,请使用1的模式匹配:

bash

即使不那么严格,如果字符串真正为空(与空白相反,意味着仅由空白字符组成)在不存在的情况下:

if [[ $CHCK == *1* ]]; then # ...

由于该问题通常标记为if [[ -n $CHCK ]]; then # ... matches *any nonempty* string ,因此这里是第一个解决方案的 POSIX兼容等效

shell
  • 请注意使用here-document(export CHCK=$(psql -h localhost -p 5432 -U foo foobar --tuples-only -c "SELECT 1 AS result FROM pg_database WHERE datname='foo_bar_1234'") # Remove leading and trailing whitespace from the value. read -r CHCK <<EOF $CHCK EOF # With whitespace trimmed, comparison with string '1' should now work as intended. if [ "$CHCK" = '1' ]; then echo "DB exists." exit 1 else echo "DB does not exist." fi )而不是bash特定的here-string(<<)和<<<(单括号)条件形式双引号变量引用。