我正在尝试根据 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
我不明白为什么在引用的变量中会发生分词。任何人都可以解释和/或建议解决方法吗?我尝试将 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
.引用所有变量以避免分词非常重要