Bash 스크립트 루프에 매개변수 추가

Bash 스크립트 루프에 매개변수 추가

나는 사용하고 싶다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""15405"foo1"""off

내장 함수를 사용하여 쉘 파서를 호출할 수 있지만 eval정확하게 인용하기는 어렵습니다. 이러한 항목에 셸 구문에서 자신을 나타내지 않는 문자가 포함되어 있는 경우 이는 특히 어렵습니다.

배열은 문자열 목록을 저장하는 올바른 방법입니다. MYARRAY사용할 태그 목록을 성공적으로 설정했다고 가정하면 배열을 반복하여 매개변수 배열을 만들 수 있습니다.

MYPARAMS=()
for t in "${MYARRAY[@]}"; do
  MYPARAMS+=("$t" " " "off")
done
whiptail "${MYPARAMS[@]}"

관련 정보