Bash 환경에서 올바르게 실행되도록 수정하려는 쉘 스크립트가 있습니다. ,쉘 스크립트에서 환경 변수를 이식 가능하게 설정합니다.
- 내가
#!/bin/bash
- 그것은 변수는 따옴표를 필요로 할 때 불분명하고 그들이하지 않을 때의 첫 번째 라인을 변경해야합니다 : 여기
내 질문은 다음과 같습니다#!/bin/zsh # Some constants. The first two will become env variables. UPDATE_DNS_API_HOST="https://example.com" UPDATE_DNS_API_URL="$UPDATE_DNS_API_HOST/my_end_point" CURRENT_PUBLIC_IP=$(curl -s "$UPDATE_DNS_API_URL" | grep -o '".*"' | tr -d '"') if [[ $PUBLIC_IP == $CURRENT_PUBLIC_IP ]]; then echo "Current IP: "$CURRENT_PUBLIC_IP" already set." else response=$(curl -s -H "Content-Type: application/json" \ --data "$CURRENT_PUBLIC_IP" "$UPDATE_DNS_API_URL") echo $response export PUBLIC_IP="$CURRENT_PUBLIC_IP" fi
여기에 스크립트의 특히 조건문에서. 여기서 몇 가지 자료를 가르쳐 주시겠습니까?
- 단일 브래킷 대 더블 브래킷에 대한 조건부 변형을 보았습니다. 어느 것을 사용해야합니까?
- 스크립트를 실행 한 후 $ PUBLIC_IP가 설정되지 않은 것처럼 보입니다. env 변수를 설정해야하는 다른 방법이 있습니까?
기타 의견을 환영합니다.
만약 당신이 호환성을 원한다면'#!/bin/sh'을 사용하고'[[$ PUBLIC_IP == $ CURRENT_PUBLIC_IP]]'를'[ "$ PUBLIC_IP"= " $ CURRENT_PUBLIC_IP "]'. ('=='는 bash와 zsh 양쪽에 존재하는 확장이지만, POSIX 표준에 의해 지정된 유일한 문자열 비교 연산자는'=')입니다. –
사실, 자신의 변수에 대한 모든 대문자는 실제로 나쁜 형식입니다. 환경 변수에 대한 POSIX 스펙은 운영 체제 또는 쉘에 의미가있는 이름이 모두 대문자로 된 이름을 가지며 응용 프로그램 사용을 위해 하나 이상의 소문자가있는 이름을 예약하도록 지정합니다. 이것은'PUBLIC_IP'는 장래 버전의 bash ('/ dev/tcp'가 어디서 바뀌는가?)를 바꾸는 것을 의미 할 수있는 반면,'public_ip'라는 변수는 다른 것을 쾅쾅 거리지 않을 것이라고 보장합니다. –
... http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html re : 위에 언급 된 명명 규칙을 참조하십시오. –