如何使用混合变量/字符串文字参数从 Bash 脚本 mkdir 或 cp?

如何使用混合变量/字符串文字参数从 Bash 脚本 mkdir 或 cp?

我正在尝试自动重置 Minecraft 世界,并将一些自定义功能复制回...重置仅意味着删除世界文件夹。无论世界是否已重新创建,将自定义函数复制到正确的位置都应该有效。

整个脚本如下,但失败的部分是这些行:

mkdir "-p $world/datapacks"
cp "-R /srv/datapacks_dev/rolla $world/datapacks"

这两行都会触发类似的消息:

mkdir: invalid option -- ' '
Try 'mkdir --help' for more information.

然而,当我回应引用的部分时,它看起来是正确的。

#!/bin/bash
if [ -d "/srv/$1/world" ]
then
  read -r -p "Are you sure? [y/N] " response
  if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]
  then
    world="/srv/$1/world"
    world_nether="/srv/$1/world_nether"
    world_the_end="/srv/$1/world_the_end"
    docker container stop $1
    rm -r $world
    rm -r $world_nether
    rm -r $world_the_end
    mkdir "-p $world/datapacks"
    cp "-R /srv/datapacks_dev/rolla $world/datapacks"
    docker container start $1
    exit 0
  else
    exit 1
  fi
else
  echo "Copy failed. /srv/$1/world doesn't exist."
  exit 1
fi

我读过几十篇文章,认为这一定很常见,但还没有找到答案......如何做到这一点?

答案1

您的 shell 将引用的参数解释为单个字符串,而不是选项和参数。不要引用选项并单独引用每个参数

将失败:

mkdir "-p $world/datapacks"
cp "-R /srv/datapacks_dev/rolla $world/datapacks"

不会失败:

mkdir -p "$world/datapacks"
cp -R "/srv/datapacks_dev/rolla" "$world/datapacks"

相关内容