#!/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
此外,删除“”仍有相同的错误
发布于 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'"'
在这种情况下,单引号是字符串分隔符,而双引号是字符串中的任何(不需要的)字符。
其内容如下:
<
ln,-s,H 117字段分隔符,H 218H 119单词,D 20,H 221H 122一个字符"连接到单词<
H 225H 126(来自D 27代码代码>以单字串<>那么它完全等价于: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).
https://stackoverflow.com/questions/73004303
复制相似问题