Bash脚本校验特定格式字符串失效,请求修正
修正后的Bash校验脚本
先给出可正确运行的校验脚本:
#!/bin/bash exp_len=10 file="a.txt" msg="checking string" tmp="File not exist" echo "$msg" if [ -f "$file" ]; then # 读取文件内容并去除换行符,避免末尾换行干扰长度判断 tmp=$(tr -d '\n' < "$file") if [[ ${#tmp} -ne $exp_len ]]; then msg="invalid length" elif [[ $tmp =~ ^A[0-9]{3}-B[0-9]{4}$ ]]; then msg="valid" else msg="invalid" fi else msg="file not exist" fi echo "$msg"
原脚本的错误点说明
- 语法空格缺失:Bash中
if与[/[[之间、]/]]与前面表达式之间必须保留空格,原脚本if[ -f $file];、if[[${#tmp} != $exp_len ]];等写法会直接触发语法错误。 - 正则表达式错误:原正则
^[A[0-9]{3}-B[0-9]{4}]$错误地用外层方括号把规则包裹成了字符集,正确规则应为^A[0-9]{3}-B[0-9]{4}$,直接匹配"A+3位数字- B+4位数字"的完整格式。 - 未处理文件换行符:
cat $file会保留文件末尾的换行符,导致实际长度多1位,用tr -d '\n'可去除所有换行,确保长度判断准确。 - 变量引用不规范:
$file、$tmp等变量未加双引号,若文件名或内容包含空格会出现异常,包裹双引号可避免此类问题。 - 长度判断运算符不严谨:长度是数值类型,在
[[ ]]中用-ne(数值不等)比!=更规范。
内容的提问来源于stack exchange,提问作者Hung Nguyen
相关产品推荐
相关产品推荐

