为什么我无法使用此#
- 评论完成我的bash脚本?
我的脚本没有执行通过注释行。
是否与前一行中使用\
反斜杠有关?
"$PSQL_HOME"/psql -h $HOST_NM \
-p $PORT \
-U postgres \
-v v1=$1 \
-v v2=$_load \
# -f Test.sql
-f Test2.sql
答案 0 :(得分:8)
你做不到。 \
将当前行连接到下一行,所以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
答案 1 :(得分:3)
从技术上讲,脚本的前六行是shell的一行。注释会停止对当前行的解释直到结束,因此在#
注释后无法恢复该行。
如果您出于某种原因想要保留选项的顺序,可以使用该语法:
"$PSQL_HOME"/psql -h $HOST_NM \
-p $PORT \
-U postgres \
-v v1=$1 \
-v v2=$_load \
$(: -f Test.sql) \
-f Test2.sql
$( ... )
正在通过执行括号内的内容来替换命令的一部分。 :
是一种空命令,有点类似于#
但不像它,它不会结束当前行,所以外部命令行可以在它之后恢复。
答案 2 :(得分: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[@]}"
答案 3 :(得分: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>
请注意两个之后的空格 - 它会使 #start a word 。该行被解释为注释。单词四作为另一个命令的开头。