awk -F '=' "/\[$section\]/{a=1}(a==1 && \"$key\"==\$1){\$2=\"=\"$value\"\"}1" $file > tmp.ini cat tmp.ini |grep devtype 为什么输出是devtype =1,而不是devtype=1
时间: 2023-06-27 07:07:52 浏览: 201
这是因为在awk命令中,你使用了双引号来包含字符串,而双引号会对其中的变量进行展开和替换。所以在将$value的值赋给\$2时,双引号也被包含了进去,就导致了输出中出现了多余的空格。
为了避免这种情况,你可以使用单引号来包含字符串,这样其中的变量就不会被展开和替换:
```
awk -F '=' '/\['$section'\]/{a=1}(a==1 && "'$key'"==$1){$2="="'$value'""}1' $file > tmp.ini
```
这样输出就会是devtype=1了。
相关问题
#!/bin/sh 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=$(echo "$value" | sed 's/[\/&]/\\&/g') # 对 $value 进行转义 awk -F '=' "/\[$section\]/{a=1} (a==1 && \"$key\"==\$1){\$2=\"$value\"; print} (a==1 && /^\[/){a=0} {print}" $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
这是一个 Shell 脚本,用于读取和设置 ini 文件中的值。脚本接受五个参数:操作(get 或 set)、文件名、节名、键名和键值。如果操作为 get,则读取对应 ini 文件中指定节和键的值并输出;如果操作为 set,则设置对应 ini 文件中指定节和键的值为给定的键值,并输出更新成功的信息。
具体实现时,使用 awk 命令读取 ini 文件,通过匹配节名和键名来获取或设置对应的键值。其中,set 操作需要对给定的键值进行转义处理,以避免出现特殊字符导致的错误。最后,将修改后的内容写回原文件中。
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命令中的一个变量。
阅读全文