#!/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分析上述代码, 为什么执行【 ./ini-rw.sh "set" "/opt/app/bin/cfg/net.conf" "main" "devtype" "1"】 修改不了devtype的值
时间: 2023-06-27 13:08:34 浏览: 32
经过分析,可能原因有以下几点:
1. ini 文件路径不正确,导致脚本找不到要修改的 ini 文件。
2. section 或 key 名称不正确,导致脚本无法正确读取或修改对应的值。
3. 脚本没有执行权限,导致无法修改 ini 文件。
建议按照以下步骤进行排查:
1. 确认 ini 文件路径是否正确,可以使用绝对路径或相对路径,确保脚本能够找到要修改的 ini 文件。
2. 确认 section 和 key 名称是否正确,可以手动打开 ini 文件,查看对应的名称是否正确。
3. 确认脚本是否具有执行权限,可以使用 `chmod +x ini-rw.sh` 命令添加执行权限。
如果以上步骤都确认无误,但仍然无法修改 ini 文件的值,可以尝试打印出脚本中的变量值,排查问题所在。
相关问题
#!/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 操作需要对给定的键值进行转义处理,以避免出现特殊字符导致的错误。最后,将修改后的内容写回原文件中。
#!/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 会少一个等号=?
这是因为 awk 命令中的分隔符为等号=,而在 set_ini_value() 函数中直接使用了等号=来赋值,导致 awk 命令解析时出现了问题。
解决方法:
可以将 awk 命令中的分隔符改为其他字符,例如冒号:,并在 set_ini_value() 函数中也使用相同的字符来赋值。例如修改代码如下:
```
#!/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=$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"】 就不会出现等号=丢失的问题了。