尝试调试我的bash脚本。这里我的语法有什么问题?我试图评估用户输入的参数,并根据该IF-THEN
语句运行一个参数。但是,我找不到命令。
到目前为止,这是我的剧本:
if [[ $# != 4 ]]; then
echo "Usage: ./test.sh <ABC|XYZ> <owner> <db> <TARGETHOST>" 2>&1
exit 1
fi
case $1 in
ABC|XYZ)
filename="get-$1.sql"
;;
*)echo "Must enter ABC or XYZ"
exit 1
;;
esac
export OWNER=$2
export DB=$3
export HOST_NM=$4
export PORT=5432
export LOG="test-$1.log"
PSQL=`which psql`
if [[$1=="ABC"]]; then
RUNCLI=$("$PSQL" -h $HOST_NM -p $PORT -U $OWNER $DB -F $'\t' --no-align -f get-$1.sql | tee >> $LOG)
exit 1
else
echo "Error running report ..."
fi
if [[$1=="XYZ"]]; then
RUNCLI2=$("$PSQL" -h $HOST_NM -p $PORT -U $OWNER $DB -a -f get-$1.sql | tee >> $LOG)
exit 1
else
echo "Error running report ..."
fi
错误:
./test.sh: line 41: [[XYZ==ABC]]: command not found
Error running report ...
./test.sh: line 51: [[XYZ==XYZ]]: command not found
Error running report ...
答案 0 :(得分:1)
虽然问题已在评论部分得到解答,但我想给出答案并分享一些不明显的知识(至少不适合我)。
bash中的if
只检查以下命令的返回代码,这意味着您可以编写if [ condition ]...
而不是if [[ condition ]]...
或if ./configure && make...
。
[
和[[
分别是命令或shell-built-ins,而不是if语法的一部分。例如which [
会返回/bin/[
。
此时很明显,在括号和条件之间需要空格,因为它只是传递给命令的一组参数。
如果你有这个想法,你永远不会忘记这些空间。