首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当文件名中有空格时,ln命令中断。

当文件名中有空格时,ln命令中断。
EN

Stack Overflow用户
提问于 2022-07-16 12:41:02
回答 1查看 49关注 0票数 0
代码语言:javascript
复制
#!/bin/bash
for i in instances/*; do
        #echo $i
        if [[ -d "${i}/.minecraft/" ]]; then
                echo "${i}/.minecraft/"
                if [ -h "${i}/.minecraft/saves" ]; then
                        rm -f "${i}/.minecraft/saves"
                else rm -rf   "${i}/.minecraft/saves";
                fi
                ln -s saves '"'${i}/.minecraft/saves'"'
        fi
done

这是我在PolyMC安装程序中链接保存的脚本。问题是,如果目录有一个空格,代码就不能工作:

instances/1.19 Sodium/.minecraft/ --它有以下输出:

ln: target 'Sodium/.minecraft/saves"': No such file or directory

此外,删除“”仍有相同的错误

EN

回答 1

Stack Overflow用户

发布于 2022-07-16 22:47:22

正如大家已经评论过的,不是关于删除'"',而是在双引号中引用您的$i。它也不是“和”的随机组合,以使它发挥作用。

解释:

i包含像:i="1.19 Sodium"这样的空格时(这里的双引号是分隔符,而不是字符串的字符),

线ln -s saves '"'${i}/.minecraft/saves'"'

被视为:

ln -s saves '"'1.19 Sodium/.minecraft/saves'"'

在这种情况下,单引号是字符串分隔符,而双引号是字符串中的任何(不需要的)字符。

其内容如下:

<

  1. 单词ln
  2. A字段分隔符,
  3. 单词-s

H 117字段分隔符,H 218H 119单词,D 20H 221H 122一个字符"连接到单词<

  1. >D24,<>H 225H 225H 126(来自D 27代码代码
    1. >以单字串<
    2. >

那么它完全等价于:ln -s saves '"1.19' 'Sodium/.minecraft/saves"'

这不是您想要的,以及为什么错误消息说Sodium/.minecraft/saves"不存在。

正如@tkausl所评论的,解决方案是"${i}/.minecraft/saves" (或者没有大括号"$i/.minecraft/saves")。

这样,当i包含像:i="1.19 Sodium"这样的空格时,

线ln -s saves "$i/.minecraft/saves"

被视为:

  • ln -s saves '1.19 Sodium/.minecraft/saves',
  • 或(等效) ln -s saves "1.19 Sodium/.minecraft/saves"、
  • 或(等效) ln -s saves 1.19\ Sodium/.minecraft/saves.

更正后,i中的任何空格将不再被解释为字段分隔符,因为i位于由双引号分隔的字符串中。

结论:永远不要使用非引用变量(甚至echo "$i"而不是echo $i).

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73004303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档