用于输入目录的Shell脚本(文件夹名称包含空格)

时间:2012-11-01 08:50:46

标签: shell unix directory

我正在编写一个shell脚本来输入多个文件夹。 我目前将文件夹的名称存储在shell变量中path="October\ @012/"。 如果我cd $path我收到错误 bash:cd:October \:没有这样的文件或目录

我做错了什么?

2 个答案:

答案 0 :(得分:5)

这是双引号的(主要)函数,在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
% 

简单!

在您的初始示例中,您所做错的是转义内部引号。该空间不必转义两次,因为这个冗余的\出现在引号内,它只是在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
% 

已编辑以添加示例)

答案 1 :(得分:1)

编辑:我最初写的是建议使用花括号。当我在半夜醒来并且修改了我的答案时,我写了这个。

首先它真的取决于你在编写脚本的哪个 shell。如果是bash那么你可以尝试在变量名周围使用引号:

TARGET="October @012"

cd "$TARGET"

这也适用于其他shell。我建议你尝试一下。

编辑:

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

path="October \@012"

cd "$path"