さまざまなキーと値のペアを格納する2つのスクリプト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