조건문은 에서 아무런 효과가 없습니다. ./script[닫기]

조건문은 에서 아무런 효과가 없습니다. ./script[닫기]

히스토리 파일 조작 스크립트를 만들려고 합니다.

예를 들어 다음을 실행하여 시크릿 모드를 구현하려고 하면

unset HISTFILE

명령이 새 셸에서 실행되므로 아무런 효과가 없습니다. 내가 시도할 때

. ./script

명령은 작동하지만 스크립트에 전달된 매개변수를 처리하는 데 사용하는 조건으로 인해 구문 오류가 발생합니다.

해결책이 있나요? 해결됨: 문제는 잘못된 조건부 사용 및 zsh 스크립트의 비호환성이었습니다.

case $1 in
    (set)
        HISTFILE=$2
        HISTFILESIZE=$3
        ;;
    (incognito)
        unset HISTFILE
        ;;
    (removesizelimit)
        HISTSIZE=-1
        HISTFILESIZE=-1
        ;;
    (clear)
        rm -f $HISTFILE
        unset HISTFILE && exit
        ;;
    (backup)
        tar -cf HISTFILE.tar $HISTFILE
        ;;
    ("")
        echo "Usage:"
        echo " . ./history <option>"
        echo " . ./history set <HISTSIZE> <HISTFILESIZE>"
        echo
        echo "Manipulate history file"
        echo
        echo "Options:"
        echo -e " incognito\t\t\tdo not record history of commands in this session"
        echo -e " removesizelimit\t\tremove limitation of size of history file"
        echo -e " clear\t\t\t\tclear history of run commands"
        echo -e " backup\t\t\t\tclear create a backup of history file in archive"
        ;;
    (*)
        echo "ERROR: Option unrecognized"
        echo
        echo "run . ./history for help"
esac

답변1

이 답변의 대부분은 질문이 편집되기 전에 더 의미가 있었습니다. :)

오류는 간단합니다.

if [ "$1" == "proto" ]; then
    TESTVAR=
if [ "$1" == "set" ]; then
    HISTFILE=$2
    HISTFILESIZE=$3
elif [ "$1" == "incognito" ]; then
# ....

여기서 두 번째는 if이어야 합니다 elif. bash일치하는 항목이 없어서 불평합니다 fi.

이 스크립트에 관해 언급하고 싶은 두 가지 사항이 더 있습니다.

  1. unset이것은 하위 쉘에서 실행되고 원하는 것이 아닌 명령의 출력을 실행합니다 .

    $(unset HISTFILE)
    

    $(...)연산자를 제거 해야 합니다 .

  2. 이는 #!/bin/bash스크립트가 바이너리에 대한 인수로 독립적으로 실행될 수 있음을 의미합니다 /bin/bash. 이는 이와 같은 스크립트에는 적합하지 않으므로 수행하지 않는 것이 좋습니다(그리고 실행 권한을 설정하지 않는 것이 좋습니다).


마지막 한가지. 중첩된 if/else를 통한 매개변수 구문 분석은 약간 서투릅니다. 다음 명령문 을 사용할 수 있습니다 case.

case $1 in
    (proto) TESTVAR= ;;
    (set)
        HISTFILE=$2
        HISTFILESIZE=$3
        ;;
    #...etc...
    ("")
        # ... put your usage here...
        ;;
    (*)
        echo >&2 "ERROR: Option unrecognized"
        echo >&2
        echo >&2 "run . ./history.bash for help"
        ;;
esac

zsh에서 스크립트가 작동하도록 설정합니다.

  1. 의 사용법을 ==로 바꾸십시오 =. 이 ==연산자는 이 연산자에 대한 비표준 별칭이며 =이는 중단되는 경우 중 하나입니다.
  2. HISTFILESIZE다음으로 이름 바꾸기SAVEHIST

관련 정보