Bash实现元音过滤的自定义函数调用返回空字符串问题排查
异常根本原因
两个Bash内置语法规则被忽略,直接导致函数版本无输出:
- 位置参数作用域隔离:Bash的自定义函数拥有独立的位置参数栈,函数内部读取的
$1、$2等变量,指向的是调用该函数时传入的参数,不会自动继承外层脚本的命令行参数。
无函数封装的裸写版本没有函数嵌套,此时的$1直接对应执行脚本时传入的命令行内容,因此能正常拿到待处理字符串。 - 函数调用未传参:定义完
string函数后,直接无参执行string,此时函数内部的$1值为空,后续echo $1 | grep ...实际处理的是空字符串,自然不会触发元音删除逻辑,也没有任何输出返回。
附带的实现隐患提示
原有逻辑虽然在测试场景下得到了正确输出,但存在潜在瑕疵:
- 匹配串里的
\|是为基础正则做的转义,仅适配grep的匹配规则;但对tr命令来说,不需要正则语法,传入未加引号的$x时,tr会把内容里的反斜杠、竖线也当成需要删除的字符,只是测试输入里没有这两类字符,才没有暴露异常。 - 正确的字符集匹配写法不需要用竖线拼接,直接把所有目标元音字符放入
[]组成字符集,即可同时适配grep和tr的语法规则。
正确实现的示例代码
vowels="AEIOUaeiou" remove_vowels() { # 读取函数传入的第一个参数作为待处理字符串 local input_str="$1" if echo "$input_str" | grep -qE "[$vowels]"; then echo "$input_str" | tr -d "[$vowels]" fi } # 把脚本执行时传入的命令行参数,显式传给处理函数 remove_vowels "$1"
内容的提问来源于stack exchange,提问作者Anatoly Rapoport
相关产品推荐
相关产品推荐

