Bash递归函数变量修改失效原因及预期输出实现方法
问题原因
- 参数传递被拆分:递归调用
fun $var时未给$var加双引号,Bash会将变量内空格分隔的内容拆分为多个独立参数,导致每次递归中$1仅获取第一个"A",而非完整字符串,因此每次输出都是单个"A"。 - 无递归终止条件:原代码没有设置停止递归的逻辑,会无限执行直到栈溢出。
实现预期输出的方法
需要两处修改:
- 递归调用时用双引号包裹参数,保证完整字符串传递
- 添加递归终止条件(可通过限制行数或字符串长度实现)
示例代码(限制输出5行)
fun() { local var="$1" local current_line="$2" # 达到指定行数后退出递归 if [ "$current_line" -gt 5 ]; then return fi echo "$var" var="$var $var" fun "$var" $((current_line + 1)) } fun "A" 1
无行数限制的实现(按字符串长度终止)
fun() { local var="$1" echo "$var" # 当字符串长度超过32时停止(可自行调整阈值) if [ ${#var} -gt 32 ]; then return fi var="$var $var" fun "$var" } fun "A"
修正后输出
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
内容的提问来源于stack exchange,提问作者Filippo Guenzi
相关产品推荐
相关产品推荐

