현재 모바일 앱의 일부 빌드 관련 작업에 사용하고 있는 쉘 스크립트가 있습니다.
BSD와 GNU 간의 미묘한 차이로 인해 원래 Mac(BSD)에서 작성된 빌드 스크립트 중 하나입니다.
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
.