我在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语句中声明它吗?
您的大多数变量都是冗余的。如果您没有在命令行上指定各种参数,则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
当您填充/dev/scripts/.mykey时,用form key = value中的行中的行时,您可以源源。
$ 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.