명령 대체를 통해 빈 변수에 기본 할당

명령 대체를 통해 빈 변수에 기본 할당

다음 구문을 사용하려고 합니다.

A=${B:-C}

A변수는 어디에 있고, B할당하려는 값은 CB가 비어 있을 때의 기본값입니다.

B이제 명령 대체를 사용 하고 싶으 nc -l 443므로 nc포트 443을 통해 문자열이 수신되면 변수에 할당되고 A그렇지 않으면 A기본값으로 설정됩니다. 나는 다음과 같이 명령을 작성합니다.

A=${`nc -l 443`:-NULL}

하지만 오류가 발생합니다.

-bash: A=${`nc -l 443`:-NULL}: bad substitution

이 목표를 어떻게 달성할 수 있나요?

답변1

다음을 제외하고는 최신 Bourne과 유사한 쉘에서는 중첩 대체를 사용할 수 없습니다 zsh.

$ print -rl -- ${$(echo):-C}
C
$ print -rl -- ${$(echo 1):-C}
1

다른 쉘에서는:

A=$(nc -l 443)
A=${A:-C}

답변2

Bash에서는 다음 줄을 사용합니다.

A=${B:-C}

설정되어 있고 비어 있지 않은 경우 변수의 값을 B변수에 할당합니다. 그렇지 않으면 변수는 단일 문자를 포함하는 문자열인 값을 가져옵니다.ABACC

당신이 하고 싶은 일:

B=$( some command )
A=${B:-C}

이후에는 비어 있지 않은 경우 출력되거나 비어 있는 경우 문자가 출력 $A됩니다 .some commandC

답변3

명령 대체를 사용하여 bash에서 변수를 설정하는 경우 다음과 같이 명령이 실패할 때 해당 변수를 기본값으로 지정할 수 있습니다.

uid=$(id -u root || echo NULL)
echo $uid
uid=$(id -u nosuchuser || echo NULL)
echo $uid

역따옴표 구문을 선호하는 경우:

uid=`id -u nosuchuser || echo NULL`

stderr를 다음으로 리디렉션하여 오류 메시지를 무음으로 설정할 수 있습니다 /dev/null.

uid=$(id -u nosuchuser 2>/dev/null || echo NULL)

관련 정보