Shell中如何向函数传递字符串变量 传参报错bad variable name解决方法
问题根源
- 报错的核心原因是定义
local string=$1时没有给$1包裹双引号,Shell执行变量展开时会默认按空白符拆分内容,实际传入带空格的参数后,该行代码等价于local string=Catch a string my friend! - Shell内置命令
local会把后面的每一个独立字段都识别为待声明的变量,friend!不符合Shell变量命名规则,因此抛出变量名非法的报错。 - 部分场景下交互式Shell默认开启的历史扩展功能也会对字符串中的
!做特殊解析,进一步引发异常。
修复方案
- 函数内给变量赋值位置的参数加上双引号,避免内容拆分:
receive_string() { local string="$1" echo "$string" }
- 如果是在交互式Shell环境调用,有两种可选方案处理感叹号的历史扩展问题:
- 传参时用单引号包裹字符串:
receive_string 'Catch a string my friend!' - 临时关闭历史扩展:执行
set +H后再调用原命令,后续可执行set -H恢复历史扩展功能。
修复后调用即可得到预期输出:
Catch a string my friend!
内容的提问来源于stack exchange,提问作者user10869266
相关产品推荐
相关产品推荐

