1

我正在编写一个 shell 脚本来输入多个文件夹。我目前将文件夹的名称存储在 shell 变量中path="October\ @012/"。如果我这样做cd $path了,我会收到错误bash: cd: October\: No such file or directory

我究竟做错了什么?

4

2 回答 2

6

这是双引号的(主要)功能,在 csh 和 *sh shell 中也是如此。

cd "$TARGET"

应该这样做。

Shell 变量在 within 中展开"..."(与 within 不同'...'),但是当 shell 解析命令行以构造传递给程序的字符串时,引用的文本被视为单个参数。

例如:

% ls -F
October @012/
% TARGET="October @012"
% cd $TARGET
bash: cd: October: No such file or directory
% cd "$TARGET"
% pwd
/tmp/t/October @012
% 

简单的!

您在最初的示例中做错了什么是转义引号内的空格。空格不必转义两次,因为这个多余\的出现在引号内,它只是在 TARGET 变量中插入一个反斜杠。例如:

% TARGET="October\ @012"  # wrong!
% ls
October @012/
% cd $TARGET
bash: cd: October\: No such file or directory
% cd "$TARGET"
bash: cd: October\ @012: No such file or directory
% 

TARGET仅当目录名为时,此设置才有效October\ @012,其中带有反斜杠(不推荐!):

% mkdir October\\\ @012
% ls -F
October\ @012/
% cd "$TARGET"
% pwd
/tmp/t/October\ @012
% 

编辑添加示例)

于 2012-11-01T12:21:15.153 回答
1

编辑:我最初写信建议使用花括号。我在半夜醒来并修改了答案时写了这篇文章。

首先,它实际上取决于您在哪个shell 中编写脚本。如果是 bash,那么您可以尝试在变量名周围使用引号:

TARGET="October @012"

cd "$TARGET"

这也可以在其他 shell 中工作。我建议你试试看。

编辑:

在重新检查这一点时,您似乎在逃避表达中的错误部分。试试这个:

path="October \@012"

cd "$path"
于 2012-11-01T08:54:52.160 回答