#!/bin/sh # /opt/app/bin/ini-rw.sh "set" "/opt/app/bin/cfg/net.conf" "main" "devtype" "1" operate=$1 file=$2 section=$3 key=$4 value=$5 # 读取 ini 文件中的值 get_ini_value() { section=$1 key=$2 awk -F '=' "/[$section]/{a=1} (a==1 && "$key"==$1){print $2;exit}" $file } # 设置 ini 文件中的值 set_ini_value() { section=$1 key=$2 value=$3 awk -F '=' "/[$section]/{a=1} (a==1 && "$key"==$1){$2="$value"}1" $file > tmp.ini mv tmp.ini $file } if [[ $operate = "get" ]]; then val=$(get_ini_value $section $key) echo $val else set_ini_value $section $key $value echo 'update success' fi分析上述代码, 为什么执行: 【./ini-rw.sh "set" "/opt/app/bin/cfg/net.conf" "main" "devtype" "1"】 这个语句后 ,devtype 1 会少一个等号=?
时间: 2023-07-16 22:12:32 浏览: 45
在set_ini_value函数中,使用了awk命令对配置文件进行修改,其中"$2"="$value"这一行代码实际上是想将第二个字段(即等号后面的值)修改为$value,但是由于"$2"被双引号括起来了,导致awk将其视为字符串,而不是变量。因此,awk会将整个"$2"="$value"当作一个字符串输出,从而导致了devtype 1缺少了等号。
解决方法是将"$2"="$value"改为$2="$value",这样awk就会将$2视为变量,从而正确地进行替换操作。修改后的set_ini_value函数如下所示:
```shell
set_ini_value() {
section=$1
key=$2
value=$3
awk -F '=' "/\[$section\]/{a=1} (a==1 && \"$key\"==\$1){\$2=\"$value\"}1" $file > tmp.ini
mv tmp.ini $file
}
```
需要注意的是,在awk语句中,由于$符号在shell中有特殊含义,因此需要使用反斜杠进行转义。
相关问题
#!/bin/bash export LD_LIBRARY_PATH=/opt/FusionReplay-V12.6.7/lib:$LD_LIBRARY_PATH ./AppRun
以下是一个示例的bash脚本:
```bash
#!/bin/bash
export LD_LIBRARY_PATH=/opt/FusionReplay-V12.6.7/lib:$LD_LIBRARY_PATH
./AppRun
```
这个脚本首先设置了LD_LIBRARY_PATH环境变量,将/opt/FusionReplay-V12.6.7/lib目录添加到LD_LIBRARY_PATH中。然后,它执行了名为AppRun的可执行文件。
#!/bin/sh ROOT_SEARCH=/opt/app/bin/SearchClient ret=0 如何调用ROOT_SEARCH?并传递参数120给它,并接收它的返回值,判断返回值是不是等于120
要调用 ${ROOT_SEARCH} 程序并传递参数 120 给它,可以在脚本中加入以下代码:
```bash
${ROOT_SEARCH} 120
ret=$?
```
其中 `${ROOT_SEARCH} 120` 会调用程序并传递参数 120 给它,而 `$?` 则会获取程序的返回值并将它赋值给 `ret` 变量。可以在此基础上继续编写判断语句,例如:
```bash
#!/bin/sh
ROOT_SEARCH=/opt/app/bin/SearchClient
ret=0
if [ -e ${ROOT_SEARCH} ];then
chmod +x ${ROOT_SEARCH}
${ROOT_SEARCH} 120
ret=$?
fi
if [ $ret -eq 120 ];then
echo "The return value is 120"
else
echo "The return value is not 120"
fi
```
这样就可以调用 ${ROOT_SEARCH} 程序并传递参数 120 给它,并且判断它的返回值是否等于 120 了。