初学 bash 的作者在 if 测试中遇到困难

问题描述 投票:0回答:1

我有一个相当简单的 bash 脚本:

#!/bin/bash -xe
source /reTech/REB3bastionscripts/setup/setenv.sh
echo "##### Begin check/create reportuser   #####################################################"
if [ $REPORT_DB_ENDPOINT != none ]; then
  user_exists=$(psql -U $REPORT_DB_USER -h $REPORT_DB_ENDPOINT -d $REPORT_DB -c "SELECT rolname FROM pg_roles WHERE rolname='reportuser'" | grep reportuser -c)
  if [ "$user_exists" == "1" ]; then
    echo Reportuser exists already in $REPORT_DB database. Resetting password and updating permissions...
  else
    echo creating user reportuser for $REPORT_DB
  fi
fi
if [ !$GRAFANA_DB_ENDPOINT != none ]; then
  user_exists=$(psql -U $GRAFANA_DB_USER -h $GRAFANA_DB_ENDPOINT -d $GRAFANA_DB -c "SELECT rolname FROM pg_roles WHERE rolname='reportuser'" | grep reportuser -c)
  if [ "$user_exists" == "1" ]; then
    echo Reportuser exists already in $GRAFANA_DB database. Resetting password and updating permissions...
  else
    echo creating user reportuser for $GRAFANA_DB
  fi
fi
echo "##### End check/create reportuser   #####################################################"

无论我对 if 语句尝试哪种排列,它总是在显示局部变量 user_exists 包含的值后停止,但从不执行下一步。 结果是:

##### Begin check/create reportuser   #####################################################
+ '[' psql-reb3az-devaz-reportdbserver.postgres.database.azure.com '!=' none ']'
++ grep reportuser -c
++ psql -U rebotics -h psql-reb3az-devaz-reportdbserver.postgres.database.azure.com -d report -c 'SELECT rolname FROM pg_roles WHERE rolname='\''reportuser'\'''
+ user_exists=0

我在此恳请帮助。 谢谢。 沃尔夫冈

bash syntax
1个回答
0
投票

bash 命令行上的

-e
告诉 shell 当它执行的任何命令以非零值退出时终止。

grep ... -c
reportuser
不匹配时,它会以 1 退出,因此 shell 停止运行。请注意,对于管道,仅考虑最后一个命令的状态。

要修复,这里有几个选项:

  • 从壳上取下
    -e
    (在shebang上,
    #!
    ,顶部的线)
  • 在 grep 后面添加
    || true
© www.soinside.com 2019 - 2024. All rights reserved.