나는 사용하고 싶다whiptail
다른 프로그램의 출력을 기반으로 확인란 목록을 생성합니다. 첫 번째 프로그램에서는 각 출력 줄의 첫 번째 단어만 필요하므로 awk
.
Bash가 배열을 처리하는 방법을 이해하려면,나는 tldp에서 이 링크를 사용하고 있습니다.. 배열의 크기를 확인하는 방법을 배웠습니다.여기.
이는 예상대로 작동하지 않지만 echo
출력을 복사하고 whiptail
앞에 ""를 입력하면 작동합니다.
이 코드가 제대로 작동하도록 수정하려면 어떻게 해야 합니까?
예 program.sh
:
#! /bin/bash
find ./ -printf "%f\n"
예 mainscript.sh
:
#! /bin/bash
MYARRAY=($(./program.sh -l | awk '{print $1;}'))
MYPARAMS=" --checklist \"\" 15 40 5"
i=0
while [[ $i -lt ${#MYARRAY[@]} ]]
do
MYPARAMS+=" \"${MYARRAY[$i]}\" \" \" off"
i=$[$i+1]
done
whiptail $MYPARAMS
echo $MYPARAMS
exit
답변1
이는 매우 이상적인 솔루션은 아니지만 다음을 사용할 수 있습니다 eval
.
eval whiptail $MYPARAMS
문제가 참조에 있다고 생각됩니다. 그러나 MYPARAMS를 배열로 구성하면 예상대로 작동합니다.
#! /bin/bash
MYARRAY=($(./program.sh -l | awk '{print $1;}'))
MYPARAMS=( --checklist "" 15 40 5 )
i=0
while [[ $i -lt ${#MYARRAY[@]} ]]
do
MYPARAMS+=( "${MYARRAY[$i]}" " " off )
i=$[$i+1]
done
whiptail "${MYPARAMS[@]}"
echo "${MYPARAMS[@]}"
exit
답변2
MYPARAMS
배열 대신 문자열을 만드는 이유는 무엇입니까 ? MYPARAMS
유사한 문자열이기 때문에 --checklist "" 15 40 5 "foo1" " " off
쉘 명령줄은 매개변수 , (두 개의 큰따옴표로 구성된 문자열), , , , , 및 를 사용 whiptail $MYPARAMS
하여 호출합니다 . 변수 확장을 따옴표로 묶지 않은 상태로 두면 해당 값은 각 공백 시퀀스의 필드로 분할되고 결과 필드는 와일드카드 패턴으로 처리되며, 파일과 일치하면 와일드카드 패턴이 확장됩니다. 따옴표는 셸 구문의 일부입니다. 따옴표는 셸 구문 분석기에 의해서만 확장되며 변수 확장의 일부로는 확장되지 않습니다.whiptail
--checklist
""
15
40
5
"foo1"
"
"
off
내장 함수를 사용하여 쉘 파서를 호출할 수 있지만 eval
정확하게 인용하기는 어렵습니다. 이러한 항목에 셸 구문에서 자신을 나타내지 않는 문자가 포함되어 있는 경우 이는 특히 어렵습니다.
배열은 문자열 목록을 저장하는 올바른 방법입니다. MYARRAY
사용할 태그 목록을 성공적으로 설정했다고 가정하면 배열을 반복하여 매개변수 배열을 만들 수 있습니다.
MYPARAMS=()
for t in "${MYARRAY[@]}"; do
MYPARAMS+=("$t" " " "off")
done
whiptail "${MYPARAMS[@]}"