
재미로 bash를 사용하여 CLI를 만들고 싶습니다. 다음과 같은 읽기 프롬프트를 갖고 싶습니다.
CLI/[path]/:>
쉬운
read -p "CLI$PWD/:>"
하지만 그런 명령을 실행하려면 cd
디렉토리를 변경하기 위한 전체 인터페이스를 만들어야 합니다. 다른 기본 명령을 모두 수행하는 방법을 알고 있지만 주요 목표는 하나의 명령으로 디렉터리를 전환할 수 있는 것입니다.
예:
CLI/[path]/:>cd [another path]
CLI/[another path]/:>
지금까지 내 스크립트는 다음과 같습니다.
#!/bin/bash
echo "Welcome to Easy Command-Line Interface! Type 'help' for help and
commands."
while true; do
read -p "ECLI$PWD/:>"
if [ $REPLY = "help" ]; then
echo "ECLI HELP:"
echo "help: Help Menu"
echo "cd: <dir> : Changes Directory"
echo "say: <text> : Prints <text>"
echo "exit: Exits ECLI"
echo "clear: Clears screen"
echo "
"
fi
if [ $REPLY = "exit" ]; then
echo "Exiting ECLI.."
sleep 1.5
clear
break
fi
if [ $REPLY = "clear" ]; then
clear
fi
done
답변1
우선, 따옴표를 사용하기 시작해야 합니다. 분명히 당신은 그것을 알아 차렸을 것입니다
만약 [ $REPLY = "명령" ]
[: too many arguments
두 단어 이상으로 명령줄을 입력하면 실패하고 오류 메시지가 표시됩니다 . 당신은 그것을 다음과 같이 변경해야합니다
만약에 ["$답글"= "명령" ]
접근법 1: 줄을 읽고 첫 번째 단어 추출
현재 스크립트가 전체 입력 줄을 $REPLY
. 그러나 사용자가 를 입력하면 와 cd /usr/local
비교하는 것이 좋지 않습니다 . 입력 줄의 첫 번째 단어를 추출해야 합니다. 로 이 작업을 수행할 수 있습니다 . 이는 매개변수 확장의 예입니다. 이에 대한 내용은 다음에서 읽을 수 있습니다.cd /usr/local
cd
word1="${REPLY%% *}"
배쉬(1)또는POSIX 사양. 따라서 다음과 같이 스크립트를 수정할 수 있습니다.
︙ if [ "$REPLY" = "지우기" ]; 그 다음에 분명한 fi word1="${REPLY%% *}" if [ "$word1" = cd ] 그 다음에 $답글 fi ︙
접근 방식 2: 첫 번째 단어를 별도로 읽기
전체 줄을 읽고 싶은 경우는 거의 없습니다. 더 자주(이 예에서와 같이) 쉘이 줄을 단어로 분리하기를 원합니다. read
읽을 변수 목록을 명령에 제공하여 이를 수행합니다 .
︙ -p "ECLI$PWD/:>" 읽기cmd 인수 ︙ 만약에 ["$cmd"= "지우기" ]; 그 다음에 분명한 fi if [ "$cmd" = cd ] 그 다음에 CD "$args" fi ︙
접근 방식 3: 각 단어를 별도로 읽기
위의 접근 방식은 개념 증명 장난감에 적합합니다. 실제 응용 프로그램에서는 쉘이 입력 행을 단어 수에 관계없이 분할하기를 원할 것입니다. 다음 옵션 을 사용하여 배열을 읽어서 그렇게 합니다 -a
.
︙ -p "ECLI$PWD/:>" 읽기-아르 ︙ 만약에 ["${arr[0]}"= "지우기" ]; 그 다음에 분명한 fi if [ "${arr[0]}" = cd ] 그 다음에 cd "${arr[1]}" fi ︙