bash编程 - 在循环中设置变量的最佳实践与否

时间:2015-05-05 19:51:40

标签: bash shell unix

我的bash / shell脚本中有以下逻辑。从本质上讲,我试图手动传递一个参数,然后从隐藏文件中传入其他值,如下所示:

if [[ $# != 1 ]]; then
   echo "./tstscript.sh <IDNUM>" 2>&1
   exit 1
fi

MYKEY=/dev/scripts/.mykey

if [ -f "$MYKEY" ]
then
IFS=';'
declare -a arr=($(< $MYKEY))
# DECLARE VARIABLES
HOSTNM=localhost
PORT=5432
PSQL_HOME=/bin
IDNUM=$1
DBU1=${arr[0]}

export HOSTNM PORT PSQL_HOME IDNUM DBU1 DBU2
$PSQL_HOME/psql -h $HOSTNM -p $PORT -U $DBU1 -v v1=$IDNUM -f t1.sql postgres

else
    echo "Mykey not found"
fi
rt_code=?
exit 1

我是否在正确的位置宣布变量?它应该在我的if声明中声明吗?

2 个答案:

答案 0 :(得分:2)

您的大多数变量都是多余的。如果您未在命令行中指定各种参数,psql已经有一些众所周知的环境变量。其他的只是硬编码,所以定义它们并不重要。只要在使用它们之前定义它们,定义它们的位置就没那么重要了,因为这不是一个非常大的脚本。当你开始担心shell脚本的设计时,这是一个很好的迹象,表明你已经超出了shell脚本,并且已经准备好使用更强大的编程语言。

if [[ $# != 1 ]]; then
   echo "./tstscript.sh <IDNUM>" 2>&1
   exit 1
fi

MYKEY=/dev/scripts/.mykey

if ! [ -f "$MYKEY" ]; then
    echo "Mykey not found"
    exit 1
fi

# You only use the first word/line of the file,
# so this should be sufficient.
IFS=";" read -a arr < "$MYKEY"

export PGHOST=localhost
export PGPORT=5432
export PGUSER=${arr[0]}

: ${PSQL_HOME:=/bin}

"$PSQL_HOME"/psql -v v1="$1" -f t1.sql postgres

答案 1 :(得分:1)

当您使用key = value形式的行填充/dev/scripts/.mykey时,您可以获取该文件。

$ cat /dev/scripts/.mykey
DBU1=noober
FIELD2="String with space"
echo "Keep it clean, do not use commands like this echo in the file"

在您的脚本中,您可以通过获取文件来激活设置

if [ -f "${MYKEY}" ]; then
   . "${MYKEY}"
   # Continue without an array, DBU1 and FIELD2 are set.