Bash菜单脚本删除功能失效求助
修复Bash脚本的购物车删除功能
原脚本的删除功能存在核心逻辑错误,以下是修复后的完整脚本,以及问题说明:
#!/bin/bash # 验证传入的listino.txt参数有效性 if [ $# -ne 1 ] || [ ! -f "$1" ]; then echo "使用方法: $0 listino.txt" exit 1 fi LISTINO="$1" cat "$LISTINO" echo "Vuoi fare : ricerca/inserimento/eliminazione? " read answer case $answer in ricerca) echo "Inserisci stringa da cercare:" read stringa # 替换错误的awk用法,改用grep实现字符串匹配 if grep -q "$stringa" "$LISTINO"; then echo "Stringa è presente in listino" else echo "Stringa non presente in listino" fi ;; inserimento) echo "Inserisci codice prodotto:" read codice # 验证编码是否存在于价目表 if ! grep -q "\b$codice\b" "$LISTINO"; then echo "Codice prodotto non trovato nel listino!" exit 1 fi echo "Inserisci quantità prodotto:" read quantita # 验证数量为正整数 if ! [[ "$quantita" =~ ^[0-9]+$ ]]; then echo "Quantità deve essere un numero intero positivo!" exit 1 fi echo "$codice $quantita" >> carrello.txt echo "Prodotto aggiunto al carrello" ;; eliminazione) echo "Quale prodotto vuoi eliminare (inserisci il codice):" read prodottoEliminare # 检查购物车文件是否存在 if [ ! -f carrello.txt ]; then echo "Carrello è vuoto!" exit 1 fi # 通过临时文件实现删除:保留所有不匹配目标编码的行 TEMP_FILE=$(mktemp) # 精确匹配编码,避免部分字符匹配 grep -v "\b$prodottoEliminare\b" carrello.txt > "$TEMP_FILE" # 替换原购物车文件 mv "$TEMP_FILE" carrello.txt echo "Elemento cancellato (se esisteva nel carrello)" ;; *) echo "Scelta non valida" exit 1 esac
原删除功能的问题及修复说明
错误的文件遍历逻辑
原代码for stringa in carrello.txt仅将文件名赋值给变量,并未读取文件内的每一行内容。修复后改用grep -v直接过滤目标行,结合临时文件替换原文件,高效实现删除操作。条件判断语法错误
原代码[ "$stringa"=="$a" ]中==两侧缺少空格,Bash会将整个表达式视为单个字符串,导致判断永远为真。本次修复采用更简洁的文件过滤方式,无需逐行判断。未实际修改文件内容
原代码仅输出提示信息,没有对carrello.txt做任何修改。修复后通过临时文件存储过滤后的内容,再覆盖原文件,真正实现删除目标商品的功能。
额外优化点
- 添加脚本参数校验,确保传入有效的
listino.txt文件 - 修复搜索功能的awk用法错误,改用更直观的
grep - 添加商品编码存在性验证,避免添加价目表外的商品
- 添加数量合法性校验,确保输入为正整数
- 处理购物车文件不存在的边界情况
内容的提问来源于stack exchange,提问作者saretta2
相关产品推荐
相关产品推荐

