我的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声明中声明吗?
答案 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.