쉘 스크립트 전환 기능

쉘 스크립트 전환 기능

다음
과 같이 열기 및 닫기 기능이 있는 쉘 스크립트를 만들고 싶습니다 .

echo -e "Activated!"  

두 번째:

echo -e "Deactivated!" 

이를 수행할 수 있는 방법이 있습니까?

답변1

이렇게 하면 활성화의 현재 상태를 저장해야 함을 의미합니다.

가장 간단한 방법은 상태(예: "on" 또는 "active") 중 하나에 대한 파일을 만들고 다른 상태("off" 또는 "deactivated")에 들어갈 때 파일을 삭제하는 것입니다.

완료를 사용하여 빈 파일을 만들고 touch filename, 완료를 사용하여 파일이 존재하는지 테스트합니다 if [ -e filename ]; then ...; fi. .rm filename

아래에는 변수 값을 파일에 저장하여 이 상태에 대한 일부 정보를 저장할 수 있는 옵션이 제공됩니다. 이 경우 상태는 스크립트가 실행될 때마다 변경되는 영구 파일(스크립트가 호출될 때마다 생성되거나 삭제되는 파일이 아님)에 의해 전달됩니다.

다음을 사용한다고 가정합니다 bash.

#!/bin/bash

statefile=$HOME/.script.state

if [ -f "$statefile" ]; then
    . "$statefile"
fi

case $state in
    on) state=off ;;
    *)  state=on
esac

printf 'Current state is "%s"\n' "$state"

declare -p state >"$statefile"

시험:

$ bash script.sh
Current state is "on"
$ bash script.sh
Current state is "off"
$ bash script.sh
Current state is "on"
$ bash script.sh
Current state is "off"

스크립트는 각 실행이 끝날 때 in을 통해 변수를 저장하고 처음에 파일을 가져와(존재하는 경우) state거기 에서 변수를 $HOME/.script.state읽습니다 declare -p state.bash

파일은 다음과 같이 보입니다.

declare -- state="off"

declare -p state이것은 $stateif is the string 의 출력 입니다 off.


이를 통해 /bin/sh위 스크립트는 다음과 같이 작성할 수 있습니다.

#!/bin/bash

statefile=$HOME/.script.state

if [ -f "$statefile" ]; then
    read state <"$statefile"
fi

case $state in
    on) state=off ;;
    *)  state=on
esac

printf 'Current state is "%s"\n' "$state"

printf '%s\n' "$state" >"$statefile"

...상태 읽기 및 쓰기를 and 로 바꾸면 read상태 printf문자열 자체만 상태 파일에 저장됩니다.

답변2

실행될 때마다 상태를 자동으로 반전시키려는 경우 값을 반전시키는 데 유용한 "논리적 부정" 숫자 연산을 활용할 수도 있습니다. 즉, 0의 논리적 부정은 1이고 그 반대도 마찬가지입니다.

POSIX 쉘은 다음을 통해 가장 일반적인 숫자 및 비트 연산을 수행할 수 있습니다.산술 확장, 그리고배쉬는 짧지 않다, 또한 제공합니다정렬0 또는 1(및 그 이상)과 같은 정수로 색인을 생성할 수 있습니다.

실제로:

(
# our persistent file to save state into
file=./state
# array of two states, "off" is the first so that it will be 0, and "on" will be 1
states=(off on)
# import what's been saved in our state file, if present
[ -f "$file" ] && source "$file"

# within the arithmetic expansion syntax,
# we compute new state as the logical negation (the `!` operator) of the current state
state=$(( !(state) ))
printf 'state=%d\n' $state > "$file"  # save new state to persistent file

# print current state from the array using the numeric state as index 
printf 'currently %s\n' "${states[state]}"
)

엄격한 POSIX 셸에서는 배열 누락 문제를 해결해야 하기 때문에 좀 더 복잡합니다.

(
file=./state
# here we use a simple string instead of an array
states='off on'
[ -f "$file" ] && . "$file"  # the `source` command POSIXly is just `.`

state=$(( !(state) ))
printf 'state=%d\n' $state > "$file"

# here we use the `cut` tool to select the piece of string based on numeric state
echo -n 'currently '; printf '%s\n' "$states" | cut -d ' ' -f $((state+1))
)

관련 정보