我正在编写一个 bash 脚本来格式化我的分区。我想要运行的命令之一如下:
mkfs.btrfs -f -m single -L root /dev/sda1
因此我将该命令拆分为选项部分:-f -m single -L root
和分区部分:/dev/sda1
并将它们放入如下变量中:
mkfs.btrfs "${myoptions}" /dev/"${mypartition}"
但失败了:
mkfs.btrfs: invalid option -- ´ ´
我尝试了不同的方法,比如将两部分放在双引号中,但都失败了。我还尝试将这两部分放入一个数组中,然后像这样运行它:
mkfs.btrfs "${array[1]}" "${array[2]}"
或者像这样:
mkfs.btrfs "${array[*]}"
但它也会失败。
如果我不使用选项部分来运行它,它就会起作用,所以我猜测问题出在两个参数之间的空格,但我不知道如何解决它。
答案1
我也尝试将这两部分放入一个数组中......
还不够好。每一个争论必须是数组的一个元素(或变量中的唯一值)。
args1=(-f -m single -L root)
args2=/dev/"$mypartition"
mkfs.btrfs "${args1[@]}" "$args2"
答案2
这种事情对我来说总是非常痛苦。在这种情况下,由于您的所有参数本身都没有空格,我会尝试删除双引号并让 Bash 将其分解为您的$myoptions
变量的单词。所以这样:
mkfs.btrfs ${myoptions} /dev/"${mypartition}"
使用双引号,您将获得一个-f -m single -L root
包含空格的字段。如果没有它,它将被分解为单个字段-f
-m
single
-L
,并显示与在交互式 shell 中root
键入相同的行为。mkfs.btrfs -f -m single -L root /dev/sda1
如果确实有一些包含空格的参数,则可能需要对$IFS
变量和编码进行一些技巧。
$@
您还可以使用具有其自身规则的特殊变量。
我将所有 shell 内容都写入 POSIX,因此我确信在 Bash 中有更简单的方法可以做到这一点。