我正在编写一个 shell 脚本来输入多个文件夹。我目前将文件夹的名称存储在 shell 变量中path="October\ @012/"
。如果我这样做cd $path
了,我会收到错误bash: cd: October\: No such file or directory
我究竟做错了什么?
这是双引号的(主要)功能,在 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
%
(编辑添加示例)
编辑:我最初写信建议使用花括号。我在半夜醒来并修改了答案时写了这篇文章。
首先,它实际上取决于您在哪个shell 中编写脚本。如果是 bash,那么您可以尝试在变量名周围使用引号:
TARGET="October @012"
cd "$TARGET"
这也可以在其他 shell 中工作。我建议你试试看。
编辑:
在重新检查这一点时,您似乎在逃避表达中的错误部分。试试这个:
path="October \@012"
cd "$path"