awk -F '=' "/\[$section\]/{a=1}(a==1 && \"$key\"==\$1){\$2=\"$value\"}1" $file
时间: 2023-06-27 22:07:55 浏览: 154
这是一行使用 awk 命令的脚本,用于修改 INI 文件中指定 section 和 key 的 value 值。
具体解释如下:
- -F '=' 表示使用等号作为分隔符。
- "/\[$section\]/{a=1}" 表示匹配 section 名称,如果匹配成功,则将变量 a 设置为 1。
- "(a==1 && \"$key\"==\$1)" 表示如果变量 a 等于 1 并且当前行的第一个字段与指定的 key 值相等,则执行后面的命令。
- "{\$2=\"$value\"}" 表示将当前行的第二个字段设置为指定的 value 值。
- "1" 表示打印所有行。
$file 是要处理的 INI 文件的文件名。
相关问题
awk -F '=' "/[$section]/{a=1}(a==1 && "$key"==$1){$2="$value"}1" $file 为什么少了一个=
这是因为在awk命令中,变量$1表示当前行中的第一个字段,变量$2表示当前行中的第二个字段,以此类推。而在awk命令中,等号(=)是一个分隔符,用于分隔每个字段。因此,在将变量$value赋值给第二个字段时,需要在等号前后都加上引号,以保证awk命令的正确性。正确的写法应该是:
```awk -F '=' "/[$section]/{a=1}(a==1 && "$key"==$1){\$2=\"$value\"}1" $file```
其中,变量$value需要用反斜杠(\)转义,以防止它被解释为awk命令中的一个变量。
#!/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 会少一个等号=?
在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中有特殊含义,因此需要使用反斜杠进行转义。
阅读全文