评估 for 循环时出错

Tim*_*Tim 1 shell bash eval

我正在编写一个接受两个参数的脚本:

#! /bin/bash

eval  for i in {$1..$2}; do echo $i;  done
Run Code Online (Sandbox Code Playgroud)

我运行它:

$ ./myscript 0002 0010
 syntax error near unexpected token `do'
Run Code Online (Sandbox Code Playgroud)

为什么是错误?

我认为这可能是因为循环应该分组。但是通过替换eval for i in {$1..$2}; do echo $i; doneeval { for i in {$1..$2}; do echo $i; done; },错误仍然存​​在。

注意:我希望在大括号扩展之前使用eval. 我的示例所需的输出是0002 0003 0004 0005 0006 0007 0008 0009 0010. (请参阅在大括号扩展之前执行参数扩展?

cuo*_*glm 7

那是因为shell评估了;,所以eval没看到。

您必须转义任何 shell 特殊字符以延迟其评估,并且从字面上传递到eval

eval for i in \{"$1".."$2"\}\; do echo \"\$i\"\;  done
Run Code Online (Sandbox Code Playgroud)

  • 这有效; 所以+1。但是,我认为正确的答案是“不要这样做”:`seq` 可以在没有 `eval` 的安全问题的情况下完成同样的事情,在这种情况下,可以通过使用两个精心选择的参数运行脚本来无害地证明像`./myscript.sh 02 '0010}; do echo "中午吃什么?"; 完毕; 触摸新文件;对于我在 {1..2'` (2认同)