테스트 표현식에서 부울 값 가져오기

테스트 표현식에서 부울 값 가져오기

이 bash 코드가 있습니다.

   local r2g_keep_temp=$(r2g_match_arg "--keep" "${my_args[@]}");
   local r2g_multi_temp=$(r2g_match_arg "--multi" "${my_args[@]}");

   local r2g_multi=[ "$r2g_multi_temp" || "$r2g_keep_temp" ];

$r2g_multi_temp 또는 $r2g_keep_temp가 정의된 경우 r2g_multi가 부울 값을 나타내기를 원합니다. 어떻게 해야 하나요? 위의 구문은 구문상 유효하지 않습니다.

반면에 이는 구문적으로는 유효하지만 올바른지 확실하지 않습니다.

local r2g_multi=$("$r2g_multi_temp" || "$r2g_keep_temp");

답변1

쉘 스크립트에는 부울 값이 없습니다.

이에 대한 가장 좋은 시뮬레이션은 정수 값입니다.
예를 들어, 0for true1for 입니다 false.

[[ -v variable_name ]]1경우 반환됩니다variable_name 아니요정의하거나 0만약 그렇다면예전에는.

따라서 다음을 사용하여 원하는 동작을 얻을 수 있습니다.

// If one of the variables is defined, return value of this command is 0.
[[ -v r2g_keep_temp ]] || [[ -v r2g_multi_temp ]]

// Save the return value of the last command (0 or 1).
local r2g_multi="$?"

물론 이 숫자를 원하는 대로 해석할 수 있습니다. 저는 단지 예를 보여드리고 싶었습니다.


그런데,

local r2g_multi=$("$r2g_multi_temp" || "$r2g_keep_temp");

당신이 원하는 것이 아닙니다.

  1. 먼저 변수 r2g_multi_tempr2g_keep_temp해당 값으로 대체됩니다.
  2. 이제 서브쉘이 실행을 시도할 것입니다 r2g_multi_temp.
  3. 기적적으로 값이 유효한 bash 명령인 경우 두 가지 시나리오가 있습니다.
    • 명령이 성공적으로 실행되어 stdout에 저장되었습니다 r2g_multi.
    • 명령이 실패하고 하위 쉘이 호출되었습니다 r2g_multi_temp.
      다시 비슷한 이야기입니다. 유효한 명령이라면 실행될 것입니다 stdout.추가의stdout의 값을 기반으로 명령을 실행할 수 r2g_keep_temp있으며 모든 것이 에 저장됩니다 r2g_multi.

다들 이 곳에서 도망가세요 :D

관련 정보