【问题标题】:rm adding extra backslash to variablerm 向变量添加额外的反斜杠
【发布时间】:2014-02-10 20:42:23
【问题描述】:

我正在编写一个非常简单的脚本,它将与我的 git 存储库进行交互,但我已经到了一个点,我无法弄清楚为什么会发生以下情况。

拥有:

destPath='~/Dropbox/Shared/Alex\&Stuff'
destFile='file.zip'

#git archive --format zip --output $destFile master

echo $destPath/$destFile

rm $destPath/$destFile

echo 输出正确的路径:

~/Dropbox/Shared/Alex\&Stuff/file.zip

但是 rm 失败并显示以下内容:

rm: cannot remove ‘~/Dropbox/Shared/Alex\\&Stuff/file.zip’: No such file or directory

那么,为什么在执行rm 时要添加额外的反斜杠呢? Alex\\$Stuff 而不是 Alex\$Stuff ?

【问题讨论】:

    标签: linux bash rm


    【解决方案1】:

    波浪号字符需要在引号之外才能扩展:

    destPath=~/Dropbox/Shared/Alex\&Stuff
    
    destFile='file.zip'
    
    #git archive --format zip --output $destFile master
    
    echo "$destPath/$destFile"
    
    rm "$destPath/$destFile"
    

    【讨论】:

    • 愚蠢的错误,一如既往。谢谢
    • 不客气,很高兴它成功了。我在我的代码中多次犯过类似的错误,然后花了几个小时来调试它。
    【解决方案2】:

    试试

     destPath="$HOME/Dropbox/Shared/Alex\&Stuff"
    

    Tildas 并不总是扩展到 $HOME。并且 & 符号不需要反斜杠,除非你想要一个实际的反斜杠。

    至于双反斜杠,我猜这就是rm 引用其内部字符串的方式(即,反斜杠具有特殊含义,单个反斜杠需要写为'\'--C 就是这样做的,因为例子)

    【讨论】:

    • 对不起,这不是猜谜游戏。要么你知道答案,要么你不知道。如果你不这样做,请发表评论。
    • "& 符号不需要反斜杠" ... 在单引号内。
    • 在 bash 中也不需要双引号内的反斜杠。只有当它没有被引用时才需要它。
    • @arkascha 这不是猜测。如果引用,Tildas 不会扩展到 $HOME。仅当它们位于未加引号的字符串的开头时才会这样做。
    • 对不起,但从你写的方式看来,你或多或少是在猜测。如果不是这样,那么请写得更具体(“不总是” - 所以什么时候不是?/“我猜” - 你是真的 不是猜测吗? )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2021-03-15
    • 2015-06-18
    • 2021-08-24
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多