Shell脚本读取文本文件每行前8字符作为函数输入时语法报错求助
Shell脚本读取文本文件每行前8字符作为函数输入时语法报错求助
嘿,我看了你的问题和脚本,你这报错根本原因是用了没必要的eval,而且转义引号的时候搞砸了!其实完全不用绕eval这个弯子,直接调用函数就好,既简单又不容易出错。
先给你说原脚本的问题:你用eval动态构建命令的时候,引号的转义逻辑出问题了,导致bash解析命令的时候碰到了不认识的语法,才会报“unexpected token”的错误。而且eval在这种场景下完全是多余的,shell本身就支持直接给函数传参数,根本不用动态拼命令再执行。
给你改好的脚本,你直接用就行:
#!/bin/bash input_file="input.txt" # 这里要确保你的filterTxtforfunc函数是提前定义好的,比如示例写法: # filterTxtforfunc() { # # 这里写你的函数逻辑,比如打印参数测试 # echo "传入的第一个参数: $1,第二个参数(前8位字符): $2" # } while IFS= read -r line; do # 提取每行的前8个字符 code="${line:0:8}" # 直接调用函数,传递参数即可,完全不用eval! filterTxtforfunc "$0" "$code" done < "$input_file"
再给你补充几个注意点:
- 一定要保证
filterTxtforfunc函数是在调用代码之前定义的,不然bash会找不到这个函数,报“command not found”。 - 如果你传给函数的第一个参数不是
$0($0是当前脚本的文件名),那直接替换成你实际需要的参数就行,比如函数只需要前8位字符这一个参数,那写filterTxtforfunc "$code"就够了。 - 你原来用的
IFS= read -r line是正确的写法,这样能保留行首的空格,也不会把行里的反斜杠当成转义字符,这个可以保留。
备注:内容来源于stack exchange,提问作者Fatemeh Abdollahei
相关产品推荐
相关产品推荐

