평등 검사는 항상 올바른 것 같습니다.

평등 검사는 항상 올바른 것 같습니다.

내 .zshrc에 이 기능이 있습니다.

activated=false

function test_toggle() {
  if [ $activated=false ]; then
    echo "WAS FALSE"
    activated=true
  else
    echo "WAS TRUE"
    activated=false
  fi
}

activatedfalse와 사이의 var 상태를 전환 하는 함수를 원합니다 true. 그러나 터미널을 열고 함수를 실행하면 다음과 같은 결과가 나타납니다.

$ test_toggle
WAS FALSE
$ test_toggle
WAS FALSE
$ test_toggle
WAS FALSE

함수가 activated상위 범위의 변수를 올바르게 사용하고 변경하도록 하려면 어떻게 해야 합니까?

답변1

나는 여기서 문제가 foo=bar할당( 과 동일 activated=false)이라고 생각하며 쉘 파서는 할당을 조건의 부작용으로 처리합니다. ZSH 코드에서는 항상 [[Bourne을 사용하고 [, foo=bar테스트와 과제를 구별하려면 공백을 사용해야 합니다.

activated=false
function test_toggle() {
  if [[ $activated = false ]]; then
    echo "WAS FALSE"
    activated=true
  else
    echo "WAS TRUE"
    activated=false
  fi
}

결과:

% exec zsh
% which test_toggle
test_toggle () {
    if [[ $activated = false ]]
    then
        echo "WAS FALSE"
        activated=true 
    else
        echo "WAS TRUE"
        activated=false 
    fi
}
% echo $activated
false
% test_toggle 
WAS FALSE
% test_toggle
WAS TRUE
% test_toggle
WAS FALSE
% 

관련 정보