변수의 ls 명령은 대화 상자 목록을 표시하고 선택한 옵션을 처리합니다.

변수의 ls 명령은 대화 상자 목록을 표시하고 선택한 옵션을 처리합니다.

방금 쉘 프로그래밍을 시작했는데 다음 문제를 해결할 수 없습니다.

정의된 디렉터리(예: /var) 내의 모든 디렉터리가 대화 상자 목록에 표시되기를 원합니다. 또한 이전에 정의한 변수를 선택한 폴더에 저장하고 싶습니다(모든 폴더에서 동일).

누구든지 문제에 대한 해결책을 가지고 있습니까?

편집하다//

해결책

#!/bin/bash
DIR="/var"
function cho () {
options=$(ls "$DIR" | awk '{print $1, FNR, "off"}')
cmd=(dialog --title Menu --stdout \
      --separate-output \
      --checklist "Select options:" 22 76 16)
choices=$("${cmd[@]}" ${options})
check
}
function check () {
if [ $? -eq 0 ]; then
   if [ -z "$choices" ]; then
      dialog --title Menu --msgbox "No option selected!" 5 28
      dialog --clear
      cho
else
   for choice in $choices
   do
   echo "$choice"
   done
fi
else
  clear && echo ""Cancel...
fi
}
cho

답변1

#!/bin/sh

dir='/'

select name in $( find "$dir" -type d ! -name "$dir" -maxdepth 1 ); do
    if [ -z "$name" ]; then
        echo 'error' >&2
    else
        break
    fi
done

printf 'User picked "%s"\n' "$name"

$dir이것은 다음 디렉토리를 나열 하고 사용자에게 디렉토리 중 하나를 선택할 수 있는 메뉴를 제공하는 간단한 쉘 스크립트입니다 .

선택한 항목은 에 저장됩니다 $name.

테스트해보세요:

$ sh script.sh
 1) /altroot                             7) /root
 2) /bin                                 8) /sbin
 3) /dev                                 9) /tmp
 4) /etc                                10) /usr
 5) /home                               11) /var
 6) /mnt                                12) /tmp_mnt
#? q
error
#? 0
error
#? 9
User picked "/tmp"

발견된 디렉터리 이름에 비정상적인 문자(예: 개행 문자)가 포함되어 있으면 이 스크립트가 실패할 수 있습니다.

관련 정보