unix shell脚本 - 如何正确分解冗长的字符串

时间:2015-05-04 17:03:00

标签: bash shell unix

出于可读性目的,是否有特定的方法来设置格式或某种换行符?

例如,我有一行代码是冗长的字符串,有很多输入参数:

PGPASSWORD=$DB_OWNER_PWD $PSQL_HOME/psql -h $HOST_NM -p $PORT -U $DBOWNER -v v1=$DBOWNER -v v2=$DUSER -f tst.sql postgres

我想在脚本中使它更具可读性:

PGPASSWORD=$DB_OWNER_PWD $PSQL_HOME/psql -h $HOST_NM 
                     -p $PORT 
                     -U $DBOWNER 
                     -v v1=$DBOWNER 
                     -v v2=$DUSER 
                     -f tst.sql postgres

我该怎么做?

3 个答案:

答案 0 :(得分:4)

根本不使用字符串变量来存储参数列表;使用数组。

psql_args=(
  env PGPASSWORD="$DB_OWNER_PWD"  # set environment variables
  "$PSQL_HOME/psql"
  -h "$HOST_NM"                   # host to connect to
  -p "$PORT"                      # port
  -U "$DBOWNER"
  -v v1="$DBOWNER"
  -v v2="$DUSER"
  -f tst.sql                      # script to run
  postgres                        # database to run it against
)

......并扩展它......

"${psql_args[@]}"

这使您可以使用带空格的参数而不会感到痛苦。另请参阅BashFAQ #50

现在,如果您根本不将列表存储在变量中(并且您不需要内联注释),那么只需使用尾部反斜杠。

foo \
  --bar \
  --baz

答案 1 :(得分:2)

在每行末尾使用反斜杠:

PGPASSWORD=$DB_OWNER_PWD $PSQL_HOME/psql -h $HOST_NM  \
                 -p $PORT  \
                 -U $DBOWNER  \
                 -v v1=$DBOWNER  \
                 -v v2=$DUSER  \
                 -f tst.sql postgres

确保在反斜杠后没有空格(空格或制表符)。

答案 2 :(得分:-1)

如果你把作业放在双引号内,它就会“正常工作”:

#!/bin/sh

FOO="one
     two
     three"

echo $FOO

运行时给出:

$ /tmp/var.sh 
one two three

如果你真的试图运行那个命令,那么基本的想法是:

BAR=$(echo "four
       five
       six")
echo $BAR