잘 작동하는 bash 스크립트는 sh에서 read -p 공동 프로세스를 제공하지 않습니다.

잘 작동하는 bash 스크립트는 sh에서 read -p 공동 프로세스를 제공하지 않습니다.

이 다중 선택 메뉴는 bash에서는 잘 작동하지만 android의 sh에서 시도하면 "read -p no coprocess" 오류와 함께 실패합니다.

어떤 제안이라도 환영합니다...

options=("AAA" "BBB" "CCC" "DDD")

menu() {
    echo "Avaliable options:"
    for i in ${!options[@]}; do 
        printf "%3d%s) %s\n" $((i+1)) "${choices[i]:- }" "${options[i]}"
    done
    if [[ "$msg" ]]; then echo "$msg"; fi
}

prompt="Check an option (again to uncheck, ENTER when done): "
while menu && read -rp "$prompt" num && [[ "$num" ]]; do
    [[ "$num" != *[![:digit:]]* ]] &&
    (( num > 0 && num <= ${#options[@]} )) ||
    { msg="Invalid option: $num"; continue; }
    ((num--)); msg="${options[num]} was ${choices[num]:+un}checked"
    [[ "${choices[num]}" ]] && choices[num]="" || choices[num]="+"
done

printf "You selected"; msg=" nothing"
for i in ${!options[@]}; do 
    [[ "${choices[i]}" ]] && { printf " %s" "${options[i]}"; msg=""; }
done

답변1

인터넷 검색과 독서 후에 나는 그것을 해결했다고 생각하며 적어도 지금은 나에게 잘 작동합니다 :)

sh는 프롬프트 앞의 변수를 좋아합니다.

while menu && read -rp "$prompt" num && [[ "$num" ]]; do

이 되다:

while menu && read num "$prompt" && [[ "$num" ]]; do

전체 코드는 다음과 같습니다

options=("AAA" "BBB" "CCC" "DDD")

menu() {
    echo "Avaliable options:"
    for i in ${!options[@]}; do 
        printf "%3d%s) %s\n" $((i+1)) "${choices[i]:- }" "${options[i]}"
    done
    if [[ "$msg" ]]; then echo "$msg"; fi
}

prompt="Check an option (again to uncheck, ENTER when done): "
while menu && read num "$prompt" && [[ "$num" ]]; do
    [[ "$num" != *[![:digit:]]* ]] &&
    (( num > 0 && num <= ${#options[@]} )) ||
    { msg="Invalid option: $num"; continue; }
    ((num--)); msg="${options[num]} was ${choices[num]:+un}checked"
    [[ "${choices[num]}" ]] && choices[num]="" || choices[num]="+"
done

printf "You selected"; msg=" nothing"
for i in ${!options[@]}; do 
    [[ "${choices[i]}" ]] && { printf " %s" "${options[i]}"; msg=""; }
done
echo "$msg"

관련 정보