shell脚本中循环中定义的数值变量,输出结果不是循环,为什么被错误的解释为文本字符串?【附解决方案】

例子:以下shell脚本中的内容我执行完成后输出{1..4},而不是循环

count=$(pgrep -c bash)
for i in {1..$count}
do
    echo $i
done

理想结果:

1

2

3

4

实际结果却是字符串:

{1..4}

=============================

你的Shell脚本的目的是循环打印从1到当前bash进程数的数字。如果你发现它没有按预期执行,可能是由以下原因导致的:

1、【pgrep命令未能正确找到bash进程数】:确保系统中存在bash进程,且pgrep命令能够正确地计数。如果你在非交互式Shell(例如,在脚本或后台任务中)中运行此脚本,可能会发现bash进程数大于实际你看到的终端会话数。


2、【变量插值问题】:在bash中,大括号 {} 用于创建数字范围,但你需要注意,它们在这里是作为文本字符串处理的。因此,{1..$count}实际上会被解释为文本字符串的枚举,而不是从1到$count的数字范围。这是为什么你的输出结果不是循环,而是被解释为文本字符串{1..4}。

要解决这个问题,你可以使用seq命令来创建数字序列

bashcount=$(pgrep -c bash)
for i in $(seq 1 $count)
do  
    echo $i
done

这个修改后的脚本使用了seq命令来生成从1到bash进程数的数字序列,然后将这些数字逐个打印出来。注意,seq命令在bash中是可用的,因此这个脚本应该可以正常工作在大多数常见的Linux发行版上。