읽기 시 별도의 인수/변수를 갖는 방법

읽기 시 별도의 인수/변수를 갖는 방법

재미로 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/localcdword1="${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

관련 정보