쉘 스크립트의 멀티태스킹 메뉴
메뉴에서 4가지 작업을 수행하는 쉘 스크립트(test.sh)가 있다고 가정해 보겠습니다. 작업은 터미널 기록, 다운로드 폴더, 휴지통 또는 종료를 정리하는 것입니다. 지금까지 내 코드는 다음과 같습니다
#!/bin/bash
function menu {
clear
echo "[1] Clean Terminal"
echo ""
echo "[2] Clean Downloads"
echo ""
echo "[3] Clean Trash"
echo ""
echo "[x] Exit"
echo ""
read -p "Option > " option
}
function terminal {
clear
cd
cat /dev/null > .bash_history
echo "Terminal history is now cleared!"
}
function downloads {
clear
cd
rm -r Downloads/*
echo "Downloads directory is now cleared!"
}
function trash {
clear
cd
rm -rf ~/.local/share/Trash/*
echo "Trash is now cleared!"
}
function terminate {
exit
}
end_script=0
while [ "${end_script}" != 1 ];do
menu
case ${option} in
1)
terminal
;;
2)
downloads
;;
3)
trash
;;
x)
terminate
;;
*)
clear
echo "unknown usage!"
;;
esac
done
실행된 스크립트는 다음과 같습니다.
[1] Clean Terminal
[2] Clean Downloads
[3] Clean Trash
[x] Exit
Option >
문제가 무엇입니까:
내가 겪고 있는 문제는 이 메뉴가 사용자의 단일 입력(한 번에 1개의 숫자만)만 받아들인다는 것입니다. 내가 할 수 있기를 원하는 것은 여러 개의 입력을 받아 이를 (1, 2) 또는 (1 2 3)과 같이 나누는 것입니다.
내가 지금까지 시도한 것은 ...
나는 이 문제에 대해 한동안 브레인스토밍을 해왔습니다. 내가 생각한 한 가지 방법은 별도의 기능을 만들고 모든 숫자 변경에 대해 코드를 추가하는 것이었지만 더 큰 메뉴의 경우 시간이 많이 걸리고 논리적으로 보이지 않습니다.
답변1
귀하의 질문을 이해한다면 사용자가 프롬프트에서 구분 기호로 구분된 여러 메뉴 코드를 입력할 수 있도록 허용하고 싶습니다. 그런 다음 한 번에 하나씩 처리할 수 있기를 원합니다. 그렇다면 공백을 구분 기호로 사용하면 입력 문자열을 배열로 쉽게 변환하고 해당 내용을 반복할 수 있습니다.
# let's say user enters "a b c" and we store in input_str
input_arr=($input_str)
for cmd in "${input_arr[@]}"; do
# process command associated with $cmd
done
코드를 배열에 넣는 것이 꼭 필요한 것은 아니지만 개별 코드에 액세스하고 전체를 결정하는 등의 작업이 가능하므로 편리합니다.