【问题标题】:Test a return value in bash在 bash 中测试返回值
【发布时间】:2013-12-12 10:32:40
【问题描述】:

我正在尝试编写一个 bash 脚本来创建和设置一个 postgres 数据库(如果它尚不存在)。在this 之后,我已经到了这个脚本:

if [ `psql -l | grep mydb | wc -l` -eq 1]
then
    echo "Database exists"
else:
    echo "Creating database"
    ...
fi

但无论数据库是否存在,它总是返回"Database exists"。我也试过[ "` psql -l | grep mydb | wc`" == "1" ],但它给出了相同的结果。我做错了什么?

EDITpsql -lpsql -l | grep mydb的输出是:

$ psql -l
                                       List of databases
    Name    |    Owner     | Encoding |   Collate   |    Ctype    |   Access privileges   
------------+--------------+----------+-------------+-------------+-----------------------
 geoserver  | adminhgv7rj4 | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres   | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 project_db | gis_group    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0  | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |              |          |             |             | postgres=CTc/postgres
 template1  | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |              |          |             |             | postgres=CTc/postgres
(6 rows)
$ psql -l | grep mydb
$

【问题讨论】:

  • psql -l 的输出是什么?还有psql -l | grep mydb?
  • 如果你只是想测试grep是否发现了什么,你应该使用if psql -l | grep -q mydb; then …
  • @fedorqui 我已经手动运行这些以确保它们提供正确的输出。 psql -l | grep mydb | wc -l 的输出是 0。如果我手动创建数据库,它是1,如果我放弃它,它会返回到0
  • 你有一个奇怪的grep,如果它在给定选项-q(安静)时打印任何东西。你真的给过这个选择吗?
  • 但是 psql -l | grep mydb 单独的输出是什么?只是psql -l?

标签: bash postgresql


【解决方案1】:

如果你只是想测试那个 grep 是否找到了一些东西,你应该使用

if psql -l | grep -q mydb
then
  …

【讨论】:

    【解决方案2】:

    您提到的问题包括不需要多个管道的替代方案,并且看起来更简单。

    你可以说:

    ( createdb mydb || { echo "creating.." ; false; } ) && echo "database exists"
    

    这基本上相当于说:

    if ! createdb mydb; then
      echo "Creating database";
    else
      echo "Database exists"
    fi
    

    【讨论】:

    • 感谢您的建议,但如果数据库不存在,我有一个完整的命令列表,我无法将它们全部打包。
    • @aquavitae 我不确定你所说的I can't wrap them all like that 是什么意思——你可以在任何块中插入多个语句。
    • 哦,你的意思是使用第二种形式,并在echos下面包含额外的代码。是的,这可以工作!
    • @aquavitae: .. 或者您可以调用具有多个语句的函数(而不是 echo "..." ; other statements )并在完成时输出正确的返回码。能提高可读性吗?即:( createdb mydb || { func1 ; } ) && func2(如 devnull 建议的那样。但是请注意,如果 either createdb 或 func1 工作,则 func2 发生!并且“echo”总是工作!)
    • @devnull: 以当前形式( createdb mydb || { echo "creating.." ; } ) && echo "database exists" 我相信它总是会输出database exists(有时前面是creating...),因为如果&& echo "database exists" 出现createdb mydbecho "creating..."输出 0,echo 会输出 0。因此它等同于你放在下面的 if/then/else/fi
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2023-03-16
    • 2011-09-08
    • 2015-12-23
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多