다음
과 같이 열기 및 닫기 기능이 있는 쉘 스크립트를 만들고 싶습니다 .
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
이것은 $state
if 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))
)