我想自动执行以下svn命令.注意,当从命令行发出时,此命令在我的系统上生成所需的结果 - Ubuntu 10.04,svn 1.6.6,bash shell:
svn ci -m $'Added new File: newFile.txt\nOrig loc: /etc/networking/newFile.txt' /home/user/svnDir/newFile.txt
Run Code Online (Sandbox Code Playgroud)
我想在bash脚本中运行该命令,假设文件的原始完整路径包含在变量$ oFileFull中,文件名在$ oFileName中.该脚本从svn目录执行.我需要考虑文件名和/或路径包含空格的可能性.
所以我的shel脚本里面的行可能看起来像:
svn ci -m$'Added new file: ${oFileName}\nOrig loc: ${oFileFull}' ${oFileName}
Run Code Online (Sandbox Code Playgroud)
但我希望在执行命令之前扩展变量(可能包含空格),并且我无法弄清楚如何将svn注释括在单引号中,这是为了在subversion注释日志中获取新行所必需的.我正在试着弄清楚如何正确引用和组装这个命令.任何帮助赞赏.
@Scott,我知道这已经回答了,但这里有你的约回声$味精之间的区别更多的问题的一些意见和回声"$味精".你的例子:
nl=$'\n'
msg="Line 1${nl}Line 2"
echo $msg # ouput = Line 1 Line 2
echo -e $msg # ouput = Line 1 Line 2
echo "$msg" # output = Line 1
# Line 2
Run Code Online (Sandbox Code Playgroud)
在每种情况下,知道shell传递给echo命令的参数数量确实很有帮助.Echo采用了许多论点.它按顺序将所有这些按顺序写入标准输出,除了最后一个之外,每个空格后面都有一个空格.
在第一个示例中,echo $ msg,shell将$ msg替换为您设置的字符(其中一个是换行符).然后在调用echo之前,它使用内部字段分隔符(IFS)将该字符串拆分为多个参数,并将结果的参数列表传递给echo.默认情况下,IFS设置为空格(空格,制表符和换行符),因此shell会将$ msg字符串切换为四个参数:"Line","1","Line"和"2".Echo甚至从未看过换行符,因为shell认为它是一个分隔符,就像一个空格.
在第二个例子中,echo -e $ msg,echo命令接收五个参数:" - e","Line","1","Line","2".-e参数告诉命令扩展它在参数中看到的任何反斜杠字符,但是没有,所以echo保持参数不变.结果与第一个示例相同.
在最后一个示例中,回显"$ msg",您告诉shell扩展$msg并将其内容传递给echo 但是将双引号之间的所有内容视为一个参数,因此echo接收一个参数,一个包含字母的字符串,数字,空格和换行符.它与接收字符串完全相同,因此"Line 1"和"Line 2"出现在单独的行上.
尝试这个实验:将IFS设置为任意的,如字母i,并观察shell如何以不同方式拆分字符串:
nl=$'\n'
msg="Line 1${nl}Line 2"
IFS=i
echo $msg # ouput = L ne 1
# L ne 2
Run Code Online (Sandbox Code Playgroud)
关于空白没什么特别神奇的.在这里,由于奇怪的IFS,shell将字母i视为分隔符,而不是空格或换行符.所以echo接收三个参数:"L","ne \nL"和"ne 2".(我将换行符显示为\n,但它实际上只是一个字符,如X或p或5.)
一旦你意识到shell命令行上的单引号和双引号都是关于构造命令的参数,那么逻辑就开始变得有意义了.
将换行符放在变量中,在需要换行符的任何地方使用变量,然后将较大字符串周围的引号更改为双引号。您还应该始终引用任何包含文件名的变量。
nl=$'\n'
svn ci -m"Added new file: ${oFileName}${nl}Orig loc: ${oFileFull}" "${oFileName}"
Run Code Online (Sandbox Code Playgroud)