Shell脚本和路径中的引用

时间:2013-02-24 04:33:30

标签: bash shell escaping quotes

我必须密集,但我根本无法解决这个问题。我在这里搜索并搜索过,我找不到任何作品。

我有一个简单的shell脚本。目前看起来如下。 diff命令在第二个参数(下面的红色表示)中以“No such file or directory”失败。

#!/bin/bash

set -x

cd "/Volumes/$1/Backups.backupdb/SkiAddict’s Mac/Latest"
time diff -qr /Users/n/Documents/Code "SkiAddict’s Mac/Users/n/Documents/Code"

我从终端调用这样的脚本:

bash myScript.sh Quadra

我不太了解shell脚本(实际上,根本不是很好),但这真的不是火箭科学!

我花了一个多小时的时间撞到墙上,让第一个命令(cd)上班;原来,除非“SkiAddict”中的引号字符是一个明智的引用,我得到了同样的错误(没有这样的文件或目录)。现在该行正常工作,即使我从该行复制文本并将其粘贴到diff命令中,它也不起作用。

这整个脚本是从已经工作的QuicKeys宏中复制的,它将文本输入到终端窗口中,所以我真的认为制作一个shell脚本不会是一个大问题。宏开始将此行“键入”到新的终端选项卡中:

cd /Volumes/Quadra/Backups.backupdb/SkiAddict’s\ Mac/Latest

然后按Enter键并“键入”这一行:

time diff -qr /Users/n/Documents/Code "SkiAddict's Mac/Users/n/Documents/Code"

然后再按Enter键。事情很完美。

我试过两端的双引号,两端的单引号,转义引号,两端都带有和不带双引号或单引号。什么都行不通。

帮助???

2 个答案:

答案 0 :(得分:1)

要查看您的脚本实际执行的操作,请在脚本中添加一些echo命令,以查看它是否正如您所期望的那样扩展引号和转义。只需将time diff替换为echo,如果它打印的路径与您希望它们的运行方式不同,请相应地修改它们


我认为实际上您尝试打开的第二个文件可能不存在。您最想要的路径是:

/Users/n/Documents/Code

在Unix(或mac)计算机上,所有路径都在' root'目录,也简单地知道:

/

不是'名称'你的电脑是SkiAddict's Mac


另一方面,如果您实际上尝试访问TimeMachine卷中的目录,则需要有一个相对路径,这可能只是在您的脚本中不正确。尝试使用完整路径,从/Volumes/...行中的diff开始。按照目前的情况,cd这是文件,它会尝试与之比较:

"/Volumes/$1/Backups.backupdb/SkiAddict’s Mac/Latest/SkiAddict’s Mac/Users/n/Documents/Code"

您可以通过在终端中键入cd /Volu...并使用制表符完成来确定正确的路径,直到您使用TimeMachine。制表符完成将正确地转义空格和特殊字符,并找到现有路径。也许这可以帮助您找到路径名中的错误。

答案 1 :(得分:1)

昨晚我找到了答案但是因为我刚来到这里,我无法回答我自己的问题。感谢the Bash FAQ我能够了解$'...'这使得路径中的单引号能够被反转,这使得diff命令感到满意。

不,不能以同样的方式处理cd命令。如果我改变了关于那条线的任何信息,它就不再起作用!叹息...

所以,这两行看起来像这样:

cd "/Volumes/$1/Backups.backupdb/SkiAddict’s Mac/Latest"
time diff -qr /Users/n/Documents/Code $'SkiAddict\'s Mac/Users/n/Documents/Code'

非常感谢@askewchan的帮助。即使我们没有和它在一起,但仍然很高兴让某人“谈论”它: - )