【发布时间】:2012-10-21 20:11:48
【问题描述】:
我正在编写一个 shell 脚本来输入多个文件夹。
我目前将文件夹的名称存储在 shell 变量中,例如 path="October\ @012/"。
如果我这样做 cd $path 我收到错误 bash: cd: October\: No such file or directory
我做错了什么?
【问题讨论】:
我正在编写一个 shell 脚本来输入多个文件夹。
我目前将文件夹的名称存储在 shell 变量中,例如 path="October\ @012/"。
如果我这样做 cd $path 我收到错误 bash: cd: October\: No such file or directory
我做错了什么?
【问题讨论】:
编辑:我最初写信是为了推荐使用花括号。我在半夜醒来并修改了答案时写了这篇文章。
首先,这实际上取决于您在其中编写脚本的 哪个 shell。如果是 bash,那么您可以尝试在变量名周围使用引号:
TARGET="October @012"
cd "$TARGET"
这也可以在其他 shell 中工作。我建议你试试看。
编辑:
在重新检查这一点时,您似乎在逃避表达中的错误部分。试试这个:
path="October \@012"
cd "$path"
【讨论】:
${...} 语法的功能。在这里,${TARGET} 将扩展为cd October @012,然后在空格处拆分为单词,就像以前一样。 ${...} 用于扩展可能会混淆的情况(例如$TARGETX 与${TARGET}X,或您想要进行其他处理的情况(比较echo $foo,其中$foo 未定义,与echo ${foo:-bar})
这是双引号的(主要)功能,在 csh 和 *sh shell 中也是如此。
cd "$TARGET"
应该这样做。
Shell 变量在"..." 内扩展(与'...' 内不同),但是当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
%
简单!
您在最初的示例中做错了什么是转义引号 inside 的空格。空格不必转义两次,因为这个多余的 \ 出现在引号内,它只是在 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
%
(已编辑添加示例)
【讨论】: