我有两个脚本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
.*
表示零个或多个任意字符。相比之下, 的含义*.
可能因 sed 的一种实现而异。在 GNU sed 中,它表示字面上的星号 ,*
后跟任何一个字符。观察:
$ echo 'aa' | sed 's/*./HI/'
aa
$ echo '*a' | sed 's/*./HI/'
HI