bash脚本无法在注释行之后执行

bash脚本无法在注释行之后执行,bash,unix,Bash,Unix,为什么我不能用这个#-注释来完成bash脚本? 我的脚本没有通过注释行执行。 这与在前一行中使用\反斜杠有关吗 "$PSQL_HOME"/psql -h $HOST_NM \ -p $PORT \ -U postgres \ -v v1=$1 \ -v v2=$_load \ #

为什么我不能用这个
#
-注释来完成bash脚本? 我的脚本没有通过注释行执行。 这与在前一行中使用
\
反斜杠有关吗

"$PSQL_HOME"/psql -h $HOST_NM     \
                      -p $PORT    \
                      -U postgres \
                      -v v1=$1    \
                      -v v2=$_load \
#                     -f Test.sql
                      -f Test2.sql

你不能那样做<代码>\将当前行连接到下一行,因此bash看到的是:

"$PSQL_HOME"/psql ... -v v1=$1 -v v2=$_load # -f Test.sql
                      -f Test2.sql
在这种情况下,您可以将注释移动到最后一行:

"$PSQL_HOME"/psql -h $HOST_NM     \
                      -p $PORT    \
                      -U postgres \
                      -v v1=$1    \
                      -v v2=$_load \
                      -f Test2.sql
#                     -f Test.sql

从技术上讲,脚本的前六行是shell的一行。注释会停止对当前行的解释,直到其结束,因此在
#
注释之后无法恢复该行

如果出于某种原因希望保持选项的顺序,可以使用该语法:

"$PSQL_HOME"/psql -h $HOST_NM     \
                      -p $PORT    \
                      -U postgres \
                      -v v1=$1    \
                      -v v2=$_load \
                      $(: -f Test.sql) \
                      -f Test2.sql

$(…)
通过执行括号内的内容来替换命令的一部分。
是一种空命令,有点类似于
#
,但与之不同的是,它不结束当前行,因此外部命令行可以在它之后继续。

在本例中,反斜杠转义新行。当\是最后一个字符时,shell将继续从下一行读取以完成命令的读取

/home/atul/myBash> cat -vte tst.sh 
echo one\$
two\$
#three\$
four$
/home/atul/myBash> chmod +x tst.sh
/home/atul/myBash> ./tst.sh
onetwo#threefour
/home/atul/myBash> 
根据man bash
评论
... 以#开头的单词导致该单词和
该行上的所有剩余字符都将被忽略。

忽略修改tst.sh文件

/home/atul/myBash> cat -vte tst.sh
echo one\$
two \$
# three\$
four$
/home/atul/myBash> ./tst.sh
onetwo
./tst.sh: line 4: four: command not found
/home/atul/myBash>

注意两个后面的空格-它使开始一个单词。该行被解释为注释。单词four作为另一个命令的开始。

将选项存储在数组中。注释掉数组中的任意元素比按当前的方式处理行连续体更容易

psql_options=(
     -h "$HOST_NM"
     -p $PORT
     -U postgres
     -v v1="$1"
     -v v2="$_load"
     # -f Test.sql
     -f Test2.sql
)

"$PSQL_HOME"/psql "${psql_options[@]}"

理解。谢谢你澄清这一点。很有趣。您能否详细介绍一下
$(:-f Test.sql)`?这个
$`在做什么?好主意<代码>$(…)计算
()
的内容&结果在该位置被替换
$(:…)
表示打印
命令的结果,该命令始终为空字符串。