다양한 키 값 쌍을 저장하는 두 개의 스크립트 ins.sh
와 variable.sh
.variables.sh
ins.sh
#!/usr/bin/env bash
set -e # Exit upon error
# This script generates a 64-bit system
source variables.sh
# Parse options
while getopts ":t:" opt; do
case $opt in
t )
if [ $OPTARG = TRUE ] || [ $OPTARG = FALSE ]; then
sed -i "s/*.MAKE_TESTS=.*/MAKE_TESTS=${OPTARG}/" variables.sh
else
echo "Invalid argument. -t only takes either 'TRUE' or 'FALSE'."
exit 1
fi
;;
\? )
echo "Invalid option: -$OPTARG" >&2
;;
: )
echo "Option -$OPTARG requires an argument."
;;
esac
done
변수.sh
MAKE_TESTS=TRUE
MAKE_PARALLEL=-j4
INSTALL_DIR=/tmp/install-dir
이 값을 변경하려면 다음 명령을 실행하십시오.
bash ins.sh -t FALSE
명령을 다음으로 변경해야 MAKE_TESTS=FALSE
하지만 전혀 발생하지 않습니다.
TRUE
값을 에서 으로 FALSE
또는 그 반대로 전환하고 싶습니다 . 이를 달성하기 위해 전체 문자열을 바꾸고 사용자가 제공한 값을 전달했습니다.
고쳐 쓰다
지금은 일을 끝낼 수 있는 방법을 찾았습니다. 먼저 전체 문자열을 삭제한 다음 새 문자열을 추가합니다.
sed -i "/MAKE_TESTS/d" variables.sh
echo "MAKE_TESTS=${OPTARG}" >> variables.sh
하지만 문자열 교체가 작동하지 않는 이유가 여전히 궁금합니다.
답변1
바꾸다:
sed -i "s/*.MAKE_TESTS=.*/MAKE_TESTS=${OPTARG}/" variables.sh
그리고:
sed -i "s/.*MAKE_TESTS=.*/MAKE_TESTS=${OPTARG}/" variables.sh
.*
0개 이상의 임의 문자를 나타냅니다. 대조적으로, 의 의미는 *.
sed 구현마다 다를 수 있습니다. GNU sed에서는 *
문자 그대로 별표 뒤에 문자가 오는 것을 의미합니다. 관찰하다:
$ echo 'aa' | sed 's/*./HI/'
aa
$ echo '*a' | sed 's/*./HI/'
HI