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
は私の質問は以下のとおりです。
- 私は
#!/bin/bash
- に最初の行を変更する必要がありそうでないときの変数は引用符を必要とするときには不明ですが、特に条件文ではここでいくつかのリソースを教えていただけますか?
- 私は、シングルブラケット対ダブルブラケットに関する条件のバリエーションを見てきました。どちらを使うべきですか?
- スクリプトの実行後、$ PUBLIC_IPは設定されていないように見えます。 env変数を設定する別の方法はありますか?
他のフィードバックは歓迎します。
もし本当に互換性があるなら、 '#!/ bin/sh'を使って' [[$ PUBLIC_IP == $ CURRENT_PUBLIC_IP]] 'を' ["$ PUBLIC_IP" = " $ CURRENT_PUBLIC_IP "]'。 ( '=='はbashとzshの両方に存在する拡張ですが、POSIX標準で指定されている唯一の文字列比較演算子は '=')です。 –
ところで、あなた自身の変数の大文字の名前は実際には悪い形式です。環境変数のPOSIX仕様では、オペレーティングシステムまたはシェルに意味を持つ名前にはすべて大文字の名前が付けられ、アプリケーションの使用には少なくとも1つの小文字の名前が予約されています。これは、 'PUBLIC_IP'は将来のバージョンのbash('/dev/tcp'がどこでバインドするかを変更する)を意味すると考えられますが、 'public_ip'という名前の変数は他のものに踏み込まないことが保証されています。 –
... http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html re:上で参照されている命名規則を参照してください。 –