For loop shell脚本中的命令不起作用,但单个命令在终端中起作用

For loop shell脚本中的命令不起作用,但单个命令在终端中起作用,for-loop,awk,scripting,sh,For Loop,Awk,Scripting,Sh,我的剧本很简单,只是 #!/bin/sh temp = $1 for i in 1 2 3 4 5 6 7 8 9 10 do awk -v j=$i '$1=j{print $1,$2,$3}' $temp #> text${i}.txt done 当我调用 ./shellScript.sh file.txt 没有发生任何事情,它永远运行,如果我试图查看这些文件,它们是空的 但是当我使用命令行时 awk -v j=1 '$1=j{print $1,$2,$3}' fi

我的剧本很简单,只是

#!/bin/sh
temp = $1
for i in 1 2 3 4 5 6 7 8 9 10
do
        awk -v j=$i '$1=j{print $1,$2,$3}' $temp #> text${i}.txt
done
当我调用

./shellScript.sh file.txt
没有发生任何事情,它永远运行,如果我试图查看这些文件,它们是空的

但是当我使用命令行时

awk -v j=1 '$1=j{print $1,$2,$3}' file.txt

所有内容都按原样打印首先,存在无效语法,
temp=$1
无效。事实上,它是有效的,如果
temp
$PATH
中的一个程序,
=
$1
将作为参数给出。这就是为什么shell抱怨找不到
temp

由于
temp
不受影响,因此它是空的,因此您没有向
awk
提供任何文件。当没有文件时,
awk
stdin
读取,这就是脚本不会自动停止的原因

提示,您应该考虑通过在双引号之间写入变量来保护变量,这并不是每次您都需要的,但是默认情况下保护它们更容易调试,而且几乎所有时候您真正需要的都是,通常情况下,这一点是有效的:

temp="My Document.txt"
awk -v j="$i" '$1=j {print $1,$2,$3}' "$temp"
但不是这个,将
My
Document.txt
作为两个独立的参数提供给
awk

temp="My Document.txt"
awk -v j="$i" '$1=j {print $1,$2,$3}' $temp
另外,要生成
12345678910
有一个名为
seq
的工具,通常
seq 10
会给出这个序列

以下是一个工作版本:

#!/bin/sh
temp="$1"
for i in $(seq 10)
do
    awk -v j="$i" '$1=j {print $1,$2,$3}' "$temp" > "text${i}.txt"
done
它在“命令行”上工作,因为您在脚本中给出了“file.txt”,由于矫揉造作失败,“$temp”为空

有一种很好的调试shell脚本的方法,它是
sh-x
,如果我重现您的矫揉造作错误,我得到的结果如下:

$ sh -x test.sh foo.txt
+ temp = foo.txt
test.sh: 2: test.sh: temp: not found
+ seq 10
+ awk -v j=1 $1=j {print $1,$2,$3}

在这里,您可以清楚地看到
sh
执行
awk-vj=1$1=j{print$1,$2,$3}
时没有文件参数:bug found。

temp=$1
不是有效的shell语法。请注意您收到的语法错误消息,并使用
temp=“$1”
(无空格并引用参数)。