Bash脚本在注释行后无法执行

4

为什么我无法使用这个 # 注释完成我的 bash 脚本? 我的脚本在被注释的那行之后没有执行。 这是否与在前一行使用 \ 反斜杠有关?

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

8

这样做不行。在Bash中,\将当前行与下一行连接在一起,所以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

明白了。谢谢你澄清这一点。 - noober

3

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

如果出于某些原因要保留选项顺序,则可以使用以下语法:

"$PSQL_HOME"/psql -h $HOST_NM     \
                      -p $PORT    \
                      -U postgres \
                      -v v1=$1    \
                      -v v2=$_load \
                      $(: -f Test.sql) \
                      -f Test2.sql
< p > $(...) 用括号内的内容替换命令的一部分进行执行。 : 是一种空指令,有点类似于#,但与其不同的是,它不会结束当前行,所以外部命令行可以在其后恢复执行。 < /p >

有趣。你能详细解释一下 $(: -f Test.sql) \ 吗?$ 是什么作用? - noober
1
好主意。$(...) 评估 () 中的内容,并将结果替换为该位置。$(: ...) 表示打印 : 命令的结果,该结果始终为空字符串。 - anishsane

1

将选项存储在数组中。与当前处理行连续性相比,注释掉任意元素的数组更容易。

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[@]}"

0
在这种情况下,反斜杠用于转义换行符。当 \ 是最后一个字符时,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>

请注意在two后面的空格 - 它使#开始一个单词。该行被解释为注释。单词four被视为另一个命令的开始。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接