참조 변수에서 단어 분리가 발생합니다.

참조 변수에서 단어 분리가 발생합니다.

lsblk 명령의 결과를 기반으로 대화 상자 메뉴를 만들려고 합니다. 내 목표는 첫 번째 단어를 메뉴 항목으로 읽고 나머지 단어를 메뉴 항목 설명으로 읽는 것입니다.

예를 들어:

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

이 명령은 대화 상자 --menu 옵션에 각 메뉴 항목에 대해 두 개의 매개변수(이 경우 "name" 및 "size")가 필요하기 때문에 작동합니다.

그러나 여러 단어로 구성된 설명이 포함된 동일한 명령을 사용하려고 하면("read" 내장 함수를 사용하여 두 개의 변수로 stdout에 기록) 참조되는 경우에도 두 번째 변수에서 단어 분리가 발생합니다.

#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. 단어 분리를 방지하려면 모든 변수를 인용하는 것이 중요합니다.

관련 정보