我有這個shell腳本,我想修改它以確保它在Bash環境中正確運行。從shell腳本可移植地設置環境變量
這裏的腳本:
#!/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規範指定對操作系統或外殼具有含義的名稱將具有全大寫名稱,並且爲至少一個小寫字符保留名稱以供應用程序使用。這意味着'PUBLIC_IP'對於將來的bash版本(改變'/ dev/tcp'綁定的位置?)可能是有意義的,而保證名爲'public_ip'的變量不會跺腳。 –
...查看http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html re:上述引用的命名約定。 –