現在、モバイルアプリの一部のビルド関連タスクに使用しているシェルスクリプトがあります。
BSDとGNUの微妙な違いにより、もともとMac(BSD)で書かれたビルドスクリプトの1つです。
environment=$1
if [[ -z $environment ]]; then
environment="beta"
fi
if ! [[ $environment =~ (live|beta) ]]; then
echo "Invalid environment: $environment"
exit 1
fi
mobile_app_api_url="https://api"$environment".mysite.com"
cp app/index.html.mob MobileApp/www/index.html
sed -i'' "s#MOBILE_APP_API_URL#\"$mobile_app_api_url\"#g" MobileApp/www/index.html
sedコマンドはBSD(Mac)で書かれていますが、ビルドがMacまたはUbuntu(GNU)にある可能性があるため、両方のバージョンで動作するように変更する必要があります。最良の方法は何ですか?
答え1
-i
これは、次のフラグを使用して移植性の問題を回避するために行われますsed
。
sed 'sed-editing-commands' thefile >tmpfile && mv tmpfile thefile
sed
つまり、一時ファイルに書き込んでからコマンドが失敗しない場合は、入力ファイルを一時ファイルに置き換えます。
これはsed
私が知っているすべての実装に移植可能です。
一時ファイル名を安全に生成するには、を使用しますmktemp
。これは標準ユーティリティではありませんが、アクセス可能なすべてのUnices(OpenBSD、NetBSD、Solaris、macOS、Linux)で機能します。
tmpfile=$(mktemp)
sed 'sed-editing-commands' thefile >"$tmpfile" && mv "$tmpfile" thefile
答え2
$mobile_app_api_url
s / / /のRHSにsedに意味のある文字を含めないでください。特に、& # \ newline
挿入する前に、この変数が適切にエスケープされていることを確認する必要があります。
答え3
変える:
cp app/index.html.mob MobileApp/www/index.html
sed -i'' "s#MOBILE_APP_API_URL#\"$mobile_app_api_url\"#g" MobileApp/www/index.html
ただし:
sed "s#MOBILE_APP_API_URL#\"$mobile_app_api_url\"#g" \
< app/index.html.mob > MobileApp/www/index.html
上部セクションを次のように変更して、ksh93
/に対する依存関係を削除することもできます。bash
environment=$1
case $environment in
"") environment=beta;;
live|beta) ;;
*)
printf >&2 'Invalid environment: "%s"\n' "$environment"
exit 1;;
esac
また、見ることができますenvironment=${1:-beta}
。
[[ $environment =~ (live|beta) ]]
ところで、ksh93
テストbash
$environment
含む live
またはbeta
必要に応じて聞こえません。[[ $environment =~ ^(live|beta)$ ]]
大丈夫かどうかテストしてください。はい live
またはbeta
。