需要一些清晰的shell-script的Docker安装在凤凰项目



我从一些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 [[ -zpsql -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中的代码。

最新更新