对来自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
如何更正此问题和/或检查此问题的更好方法是什么?
答案 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
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(<<
)和<<<
(单括号)条件形式双引号变量引用。