Bash 将CD插入到包含非法字符的目录路径,该字符存储在变量中

Bash 将CD插入到包含非法字符的目录路径,该字符存储在变量中,bash,shell,unix,Bash,Shell,Unix,我有一个新情况。它是关于将cd命令应用于目录的路径,我将从命令行接收该路径作为参数,并将其传递给脚本中的变量。不过,我将在下面的几个步骤中解释问题的要点。这真是太傻了,因为这里有些东西我睁大眼睛却看不见 ~>cd/home/av/Exercise\u Files/FOO\-\2005\\uu\CONT\\ubar\\u20190527\\这是废话/ 结果: ~/Exercise\u Files/FOO-2005\uucont\uubar\uuu90527;这是废话> 前一次执行使用目录名,目

我有一个新情况。它是关于将cd命令应用于目录的路径,我将从命令行接收该路径作为参数,并将其传递给脚本中的变量。不过,我将在下面的几个步骤中解释问题的要点。这真是太傻了,因为这里有些东西我睁大眼睛却看不见

~>cd/home/av/Exercise\u Files/FOO\-\2005\\uu\CONT\\ubar\\u20190527\\这是废话/
结果:

~/Exercise\u Files/FOO-2005\uucont\uubar\uuu90527;这是废话>
前一次执行使用目录名,目录名中有各种各样的东西会弄乱shell,同时它会将目录名扩展为各种可怕的解释

问题解释如下:

当我这样做时:

~>c=“/home/av/Exercise\u Files/FOO\-\2005\\uu\CONT\\ubar\\u20190527\\This\-\is\-\crap/”
我做了一个回声:

~>echo$c
/home/av/Exercise\u Files/FOO\-\2005\\uu\CONT\\uubar\\u20190527\\这是废话/
我得到了一切,因为非法字符被正确地转义并存储在变量c中

但如果我这样做:

~>cd“$c”
-bash:cd:/home/av/Exercise\u Files/FOO\-\2005\\uu\CONT\\ubar\\u20190527\\这个\-\是\-\crap/:没有这样的文件或目录
我犯了一个错误


谁能告诉我我能做些什么来解决这个问题?事实上,我也必须在rsync中使用这个过程。当我在其中使用这个变量传递方法时,rsync在尝试更改目录以同步文件时也会抛出一个错误,但我上面解释的问题是将我的脚本弄乱的核心问题。

问题是,实际上是双重转义。如果您需要将
cd
放入名为
foo-bar
的文件夹中,则
cd-foo-bar
cd-foo-bar
都可以,但
cd-foo-bar
(与您正在做的事情相当)将无法,因为它实际上正在寻找一个名为
foo-bar

的文件夹,永远不要信任
echo
。它不能提供有用的内容表示。使用
printf“%q\n'$c”
顺便说一句,也是非常密切相关的。我从未尝试过使用
printf
,尽管在打印输出时,我听说过这个命令的优点。这当然是真的,但是,如果不解释语法和文字引号/转义符/etc之间的区别以及哪些解析步骤在参数扩展后进行和不进行,OP就不一定清楚他们最初的尝试为什么是错误的。(OTOH,我百分之百确定我们有复件覆盖了这一领域)。这是我在读了Joseph的评论后所做的事
~/Exercise\u Files/FOO-2005 uucont\uuubar\uuu20190527;这是废话>
它起作用了。非常感谢你们对这个社区的评论:)太棒了!