我正在编写一个shell脚本来输入多个文件夹。 我目前在shell变量中存储文件夹的名称,如path="October\ @012/"
。 如果我做cd $path
我收到错误庆典:CD:十月\:没有这样的文件或目录Shell脚本输入目录(文件夹名称包含空格)
我在做什么错?
我正在编写一个shell脚本来输入多个文件夹。 我目前在shell变量中存储文件夹的名称,如path="October\ @012/"
。 如果我做cd $path
我收到错误庆典:CD:十月\:没有这样的文件或目录Shell脚本输入目录(文件夹名称包含空格)
我在做什么错?
这是双引号的(主要)函数,它在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
%
如果目录被命名为October\ @012
的TARGET
此设置只会工作,在这一个反斜杠(不推荐!):
% mkdir October\\\ @012
% ls -F
October\ @012/
% cd "$TARGET"
% pwd
/tmp/t/October\ @012
%
(EDITED添加例子)
编辑:我最初写了推荐使用大括号。当我半夜醒来并修改我的答案时,我写了这个。
首先它实际上取决于其壳您在编写脚本如果是bash的,那么你可以尝试使用在你的变量名引号:
TARGET="October @012"
cd "$TARGET"
这在其他贝壳工作以及。我建议你尝试一下。
编辑:
在重新审视这个看起来你是在逃避你的表达错误部分。试试这个:
path="October \@012"
cd "$path"
谢谢您的回复,它将10月和@ 012作为两个不同的文件夹。 但文件夹名称是“October @ 012”(空格分隔),我也试过ur方法,但得到这个错误 bash:cd:October:没有这样的文件或目录 – anand2308
不,这不是'$ {的功能。语法。在这里,'$ {TARGET}'将被扩展为'cd October @ 012',然后像空前一样将空格分割成单词。 '$ {...}'用于扩展可能会被混淆的情况(例如'$ TARGETX' vs'$ {TARGET} X',或者你想做其他处理的地方(比较'echo $ foo',其中$ foo未定义, vs'echo $ {foo:-bar}') –
这就是我在半夜醒来时似乎无法入睡时回答问题所得到的结果当我以前使用过这个功能时,我一直在解决问题你诺曼处理,一起包裹在引号“”,以解决OP问题。 – zzzirk
谢谢你指出我的愚蠢在睡眠不足时在深夜回答问题。您当然是对的,我在看到您正确回答问题之前编辑了我的答案。 – zzzirk
请帮我这个:我正在写一个shell脚本来输入多个文件夹。我目前将文件夹的名称存储在shell变量中,如path =“October \ @ 012 /”。如果我做CD $路径,我收到错误bash:cd:October \:没有这样的文件或目录 我在做什么错? – anand2308
谢谢你诺曼,这工作 也感谢您的解释,它帮助了很多 – anand2308