编写Shell脚本实现两文件字段对比与原文件变量更新需求
解决Shell脚本更新用户信息并保留未变更字段的问题
我来帮你搞定这个Shell脚本的问题,你的需求是更新用户信息时保留未变更的字段,还不能用grep/sed/awk对吧?先给你梳理下原脚本的问题,再给你一个能直接用的完整实现:
原脚本的核心问题
- 变量名拼写错误:比如
FirstNamTemp少了一个e(应该是FirstNameTemp),LastnameTemp大小写和定义时不一致,还有Templucky number是无效变量名(不能带空格,得改成TempluckyNumber这类格式) - 原文件读取逻辑错误:
while read a b c ; do只读取每行前三个字段,完全覆盖不到你数据里的9个字段 - 变量引用错误:判断条件里的
b != FirstNamTemp没加$,变成了字符串字面量对比,根本没用到变量的值 - 空值处理缺失:没有判断新输入是否为空,完全没实现“空输入保留原字段”的核心需求
符合需求的完整脚本实现
下面的脚本用Shell原生语法实现了你的需求,核心是利用${var:-default}(如果var为空就用default值)来处理空输入保留原字段的逻辑,全程不用grep/sed/awk:
#!/bin/bash # 提示用户输入新信息,留空直接回车就保留原值 echo "请输入新的Nickname(留空保留原值):" read newNick echo "请输入新的FirstName(留空保留原值):" read newFirst echo "请输入新的LastName(留空保留原值):" read newLast echo "请输入新的Hobbies(留空保留原值):" read newHobbies echo "请输入新的occupation(留空保留原值):" read newOcc echo "请输入新的currActive(留空保留原值):" read newActive echo "请输入新的Inactive(留空保留原值):" read newInactive echo "请输入新的YearsOld(留空保留原值):" read newAge echo "请输入新的lucky number(留空保留原值):" read newLucky # 定位原文件:如果新Nickname非空就用它找,否则提示输入原Nickname if [[ -n "$newNick" ]]; then originalFile="${newNick}.original" else echo "请输入原Nickname以定位原文件:" read originalNick originalFile="${originalNick}.original" fi # 检查原文件是否存在 if [ ! -f "$originalFile" ]; then echo "ERROR: 原文件不存在" exit 1 fi # 读取原文件的所有字段到变量(原文件只有一行数据) read originalNick originalFirst originalLast originalHobbies originalOcc originalActive originalInactive originalAge originalLucky < "$originalFile" # 处理每个字段:新输入非空用新值,空则用原值 finalNick=${newNick:-$originalNick} finalFirst=${newFirst:-$originalFirst} finalLast=${newLast:-$originalLast} finalHobbies=${newHobbies:-$originalHobbies} finalOcc=${newOcc:-$originalOcc} finalActive=${newActive:-$originalActive} finalInactive=${newInactive:-$originalInactive} finalAge=${newAge:-$originalAge} finalLucky=${newLucky:-$originalLucky} # 将处理后的内容写回原文件 echo "$finalNick $finalFirst $finalLast $finalHobbies $finalOcc $finalActive $finalInactive $finalAge $finalLucky" > "$originalFile" echo "原文件已更新完成!"
脚本工作原理
- 读取新输入:逐个提示用户输入字段,回车留空就代表保留原字段
- 定位原文件:优先用新输入的Nickname找文件,没输入的话就提示用户提供原Nickname
- 读取原数据:用
read一次性把原文件的一行数据拆成9个变量(对应你的9个字段顺序) - 字段处理:通过
${var:-default}语法自动判断,空输入就用原文件对应值,非空就用新值 - 写回文件:把处理后的所有字段拼接成一行,覆盖原文件
测试示例
假设原文件WebCrawler.original内容是:
WebCrawler Peter Parker dancing fishing student 08/09/2019 12/14/19 20 9
用户输入时,除了以下字段,其余都直接回车留空:
- occupation:
Software Jr developer - YearsOld:
24 - lucky number:
777
更新后的原文件内容会是:
WebCrawler Peter Parker dancing fishing Software Jr developer 08/09/2019 12/14/19 24 777
完全符合你“保留未变更变量”的需求。
内容的提问来源于stack exchange,提问作者Vlad Ezikon
相关产品推荐
相关产品推荐

