![尝试在 shell 脚本的循环中运行 awk 时出现“语法错误:循环变量错误”](https://linux22.com/image/121002/%E5%B0%9D%E8%AF%95%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%B8%AD%E8%BF%90%E8%A1%8C%20awk%20%E6%97%B6%E5%87%BA%E7%8E%B0%E2%80%9C%E8%AF%AD%E6%B3%95%E9%94%99%E8%AF%AF%EF%BC%9A%E5%BE%AA%E7%8E%AF%E5%8F%98%E9%87%8F%E9%94%99%E8%AF%AF%E2%80%9D.png)
我有一个awk
在终端上运行良好的命令:该awk
命令根据列标题创建不同的文件。 awk命令:
for((i=2;i<5;i++)); do
awk -v i=$i 'BEGIN{OFS=FS="\t"}NR==1{n=$i}{print $1,$i > n".txt"}' ${Batch}.result.txt
done
当合并到 shell 脚本中时,相同的命令会显示错误:
Syntax error: Bad for loop variable
它的工作方式如下。我按照建议尝试使用 she-bang,但它重复了该错误。
for i in 2 3 4; do awk -v i=$i 'BEGIN{OFS=FS="\t"}NR==1{n=$i}{print $1,$i n".txt"}'
答案1
我认为该错误与您的Awk
命令没有任何关系。我认为您正在 POSIX bourne shell 中运行它,sh
其中((
不支持 for 循环构造。
bash
运行脚本,并将 shebang 设置为安装路径。通常这样做是安全的,因为#!/usr/bin/env bash
搜索#!/usr/bin/env
,并且并不总是在 中,特别是在非 Linux 系统上。对于 OpenBSD 系统,它位于.PATH
bash
bash
/bin
/usr/local/bin
答案2
该脚本很可能是由/bin/sh
(bash
或ksh93
任何其他理解 C 类for
循环的 shell)解释的。
确保脚本有#!
一行说
#!/bin/bash
在文件的最顶部(更改为您要使用的 shell 和路径),或者显式使用正确的解释器运行脚本,例如:
bash ./scriptname
答案3
A三参数循环控制表达式在巴什应指定为:
for (( EXP1; EXP2; EXP3 ))
但在你的简单情况下我只会使用:
for i in {2..4}; do ...
答案4
为了完整起见,您的 ksh93-syntax 命令的 POSIX 等效项(因此可以与sh
包含您的ash
基于 shelldash
或 busybox的任何现代实现一起使用ash
)将是:
i=2; while [ "$i" -lt 5 ]; do
awk -v i="$i" '
BEGIN{OFS=FS="\t"}
NR==1{n=$i}
{print $1,$i > n".txt"}' < "${Batch}.result.txt"
i=$((i + 1))
done
虽然在这里,写它会更有意义:
awk -F '\t' -v OFS='\t' '
NR == 1 {for (i = 2; i < 5; i++) file[i] = $i".txt"}
{for (i = 2; i < 5; i++) print $1,$i > file[i]}' < "${Batch}.result.txt"