引用变量中发生分词

引用变量中发生分词

我正在尝试根据 lsblk 命令的结果创建一个对话框菜单。我的目标是将第一个单词读取为菜单项,将其余单词读取为菜单项描述。

例如:

$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,size | grep sda)

此命令有效,因为对话框 --menu 选项需要每个菜单项有两个参数,在本例中为“名称”和“大小”。

但是,如果我尝试使用多字描述的相同命令(使用“read”内置函数将其作为两个变量写入标准输出),则即使引用了第二个变量,也会在第二个变量中发生分词。

#commmand 1: unquoted variable
$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,type,size | grep sda |
> while read name desc; do
> echo $name $desc
> done)                      #results in output like below without quotes

#command 2: quoted variable 
$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,type,size | grep sda |
> while read name desc; do
> echo $name "$desc"
> done)                      #results in output like below without quotes

#command 3: escape quoted variable
$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,type,size | grep sda |
> while read name desc; do
> echo $name \"$desc\"
> done)                      #results in output below

命令3输出

我不明白为什么在引用的变量中会发生分词。任何人都可以解释和/或建议解决方法吗?我尝试将 lsblk 的输出写入文件并读取该文件,得到相同的结果。期望的输出是:

所需输出

编辑:我看了命令引用作为一种可能的解决方案,但它会导致 lsblk 命令输出在需要两个参数时作为一个参数传递到对话框。

谢谢。

答案1

您需要分两部分执行此操作:

# 1. read the output of lsblk, 2 words per line, into an array
parts=()
while read -r disk data; do 
    parts+=("$disk" "$data")
done < <(lsblk -lno name,type,size | grep sda)

# 2. send the elements of the array to the dialog command
dialog --menu "Choose one:" 0 0 0 "${parts[@]}"

read命令会将第一个空格分隔的工作放入disk变量中,然后将行的其余部分放入data.引用所有变量以避免分词非常重要

相关内容