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”
(无空格并引用参数)。