我从一些GitHub Phoenix repo中找到下面的shell-script(entrypoint.sh),我在多个Phoenix项目中看到了相同的代码
#!/bin/bash
# Wait until postgres is ready
while ! pg_isready -q -h $PGHOST -p $PGPORT -U $PGUSER
do
echo "$(date) - waiting for database to start"
sleep 2
done
# Create migrate and seed database if it does't exist.
if [[ -z `psql -Atqc "\list $PGDATABASE"` ]]; then
echo "Database $PGDATABASE does not exist. Creating..."
createdb -E UTF8 $PGDATABASE -l en_US.UTF-8 -T template0
mix ecto.migrate
mix run priv/repo/seeds.exs
echo "Database $PGDATABASE created."
fi
exec mix phx.server
第一个代码块是明确的,它检查Postgres准备但是第二部分我无法理解if条件行if [[ -z
psql -Atqc "list $PGDATABASE"]];
和我搜索了postgres文档和一些在线资源,但我找不到任何合理的解释在我的项目中,我认为if fi
代码块没有执行,然后我添加了3行代码来使工作
#!/bin/bash
# Docker entry point script.
# Wait until postgres is ready
while ! pg_isready -q -h $PGHOST -p $PGPORT -U $PGUSER
do
echo "$(date) - waiting for database to start"
sleep 2
done
# I added
echo "$(date) - PostgreSQL is ready"
mix ecto.create
mix ecto.migrate
# Create migrate and seed database if it does't exist.
if [[ -z `psql -Atqc "\list $PGDATABASE"` ]]; then
echo "Database $PGDATABASE does not exist. Creating..."
createdb -E UTF8 $PGDATABASE -l en_US.UTF-8 -T template0
mix ecto.migrate
mix run priv/repo/seeds.exs
echo "Database $PGDATABASE created."
fi
exec mix phx.server
这个if [[ -z `psql -Atqc "\list $PGDATABASE"` ]]; then
的解释是什么?
它运行命令psql -Atqc "\list $PGDATABASE"
,该命令试图在变量PGDATABASE中列出具有该名称的数据库。-Atqc选项删除所有额外的输出,所以如果存在,唯一的输出将是数据库名称。
if
语句上的-z
选项检查字符串的长度是否为零,如果为零则返回true。
因此if
的结果是,如果数据库不存在,则执行if
中的代码。