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

Shell 如何在if-then语句中正确使用比较运算符,shell,unix,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也不会

对来自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也不会每次都存在。我甚至用1试过,结果还是一样

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

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

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

不那么严格,如果字符串中的任何位置都有1就足够了,那么使用bash的模式匹配:

if [[ $CHCK == *1* ]]; then # ...
更不严格的是,如果字符串是空的而不是空的,则表示在不存在的情况下仅由空格字符组成:

if [[ -n $CHCK ]]; then # ... matches *any nonempty* string
由于这个问题通常被标记为shell,下面是与第一个解决方案兼容的POSIX等价物:

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

请注意,即使值为空字符串,也不会每次都使用here文档,因为它总是转到DB,这正是if语句当前的设计目的。你是说即使$CHCK为1,它也不存在吗?检查$CHCK的确切值-例如,如果它包含1左右的空格,测试将失败。if语句本身本质上是OK的,如果$CHK出现空字符串,那么echodb不会退出,程序继续执行下一步就是我要做的。至于1左右的空格,这是完全可能的。我该如何清理它呢?你能使用bash吗,或者你的代码需要严格遵守POSIX吗?是的,我相信我可以像以前一样使用bash/bin/bash是的,通过手动运行该命令,它确实会在1周围产生一些空白。这太棒了!非常感谢。你能详细说明一下阅读内容吗。为什么@noober:我的荣幸;听到这个消息我很高兴。你的回答和解释很棒。再次感谢!
if [[ -n $CHCK ]]; then # ... matches *any nonempty* string
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