【问题标题】:Shell Script to Enter a Directory (Folder Name Contains Spaces)进入目录的 Shell 脚本(文件夹名称包含空格)
【发布时间】:2012-10-21 20:11:48
【问题描述】:

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

我做错了什么?

【问题讨论】:

    标签: shell unix directory


    【解决方案1】:

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

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

    TARGET="October @012"
    
    cd "$TARGET"
    

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

    编辑:

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

    path="October \@012"
    
    cd "$path"
    

    【讨论】:

    • 感谢您的回复,它把十月和@012 作为两个不同的文件夹。但是文件夹名称是“October @012”(空格分隔),我也尝试了你的方法但是得到了这个错误 bash: cd: October: No such file or directory
    • 不,这不是${...} 语法的功能。在这里,${TARGET} 将扩展为cd October @012,然后在空格处拆分为单词,就像以前一样。 ${...} 用于扩展可能会混淆的情况(例如$TARGETX 与${TARGET}X,或您想要进行其他处理的情况(比较echo $foo,其中$foo 未定义,与echo ${foo:-bar})
    • 这就是我在半夜醒来似乎无法入睡时回答问题所得到的结果。当我过去使用它时,我一直在解决 Norman 解决的问题,并用引号 "" 括起来以解决 OPs 问题。
    • 请帮我解决这个问题:我正在编写一个 shell 脚本来输入多个文件夹。我目前将文件夹的名称存储在 shell 变量中,例如 path="October\ @012/"。如果我执行 cd $path 我会收到错误 bash: cd: October\: No such file or directory 它的紧急
    • 好的,你能不能像我和诺曼提到的那样使用 cd "$path" 来完成你想要的?
    【解决方案2】:

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

    (已编辑添加示例)

    【讨论】:

    • 感谢您指出我在半夜睡眠不足时回答问题的愚蠢行为。你当然是对的,我在看到你正确回答问题之前编辑了我的答案。
    • 请帮帮我:我正在编写一个shell脚本来输入多个文件夹。我目前将文件夹的名称存储在 shell 变量中,例如 path="October\ @012/"。如果我执行 cd $path 我会收到错误 bash: cd: October\: No such file or directory 我做错了什么?
    • 谢谢诺曼,这很有效,也感谢您的解释,它有很大帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多