- 论坛徽章:
- 4
|
你要搞清楚原理, shell解析shell脚本, 脚本里定义了一个数组, 执行到awk命令的时候, 发现PATH路径里可以找到awk程序, 于是就启动子进程执行awk程序, 怎么执行的呢?
awk 'BEGIN"{
for (i=0;i<10;++i)
{
printf "'"${array_var[$((RANDOM%5))]}"'\n",i
}
}'
你看到了, 你不知不觉中执行了一个外部程序awk, 第一个命令行参数(argv[1])是一个'BEGIN"{....}', 可以看到你用单引号包裹了第一个命令行参数, 因为你不希望shell解析与替换里面的任何内容, 导致了什么呢? ${array_var[$((RANDOM%5))]} 这堆东西就原原本本的进入了argv[1], awk解析这一句话的时候遇见了这么一行东西:
${array_var[$((RANDOM%5))]}, 它根本不知道array_var是个毛, $是个毛, 它不懂的, 你理解了吗?
所以, 请用awk "", 即双引号传递一个命令行参数, 那么shell会先解析里面的内容再启动awk程序, 于是就, 你懂了. |
|