我编写了一个bash脚本来通过git自动更新文件,但是如果我的消息包含错误,我会在git commit行中不断收到错误。
我已经用引号包裹了我的消息,这是怎么了?
我的bash脚本:
##Handle local git update
remote='
cd express-demo-nonbare;
git pull origin master;
';
echo "Process for updating Git begin";
git add . ;
read -p "Message for this commit: " comment;
comment=\"${comment}\";
echo $comment;
git commit --message=$comment;
git push backup master;
确实,在将comment
变量提供给git commit
时,只需要引用该变量即可。您可以替换:
read -p "Message for this commit: " comment;
comment=\"${comment}\";
echo $comment;
git commit --message=$comment;
with
read -p "Message for this commit: " comment;
echo $comment;
git commit --message="$comment";
引号不会成为提交消息的一部分,而是由bash
使用,以确保comment
变量的全部内容作为--message=...
的单个git
参数的一部分提交,甚至如果包含空格字符。
您不想那样说:
包装...我的报价单消息
(确实是您正在做的事情。相反,您希望保护您的消息免遭bash视为单词列表。为此,您需要加引号,但位置不同:
remote='
cd express-demo-nonbare;
git pull origin master;
'
echo "Process for updating Git begin"
git add .
read -p "Message for this commit: " comment
echo "$comment"
git commit --message="$comment"
git push backup master
我也删除了所有不必要的分号(bash将行的末尾视为命令的末尾,除非未加括号或括号的东西阻止了此操作)。
我尚不清楚您打算将变量remote
设置为文字字符串newline c d space e x ... ; newline,尤其是因为$remote
不会在脚本的后面出现。但是请注意,由于此字符串的确包含空格,因此将其扩展为[[outside引号,例如$remote
(vs "$remote"
将其扩展为引号内)可以触发进一步的shell操作。例如:
foo='this; that'
wc $foo
将使wc
程序尝试打开名为this;
和that
的文件,将空白处的$foo
拆分为单独的单词,然后将其传递给wc
。该拆分实际上基于$IFS
:
IFS=+ foo='this+that' wc $foo
尝试打开名为this
和that
的文件。将IFS恢复到其正常设置:
wc $foo
尝试打开一个名为this+that
的文件。((我有时使用
wc
作为程序来帮助显示实际的参数,因为它试图将每个参数作为文件名打开,并在随后的任何错误消息或计数中吐出实际的文件名。)] >类似地,如果变量的扩展产生了外壳球状元字符,则将在扩展后对其进行求值:
foo='*' wc $foo
将尝试打开并读取当前目录中的每个文件和目录。同样,双引号可以防止这种情况:
wc "$foo"
只会尝试打开并读取一个名为*
的文件。