我的脚本很简单,只有
#!/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
所有内容都打印出来
答案 0 :(得分:1)
首先,语法无效,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
另外,为了生成1 2 3 4 5 6 7 8 9 10
,有一个名为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 -v j=1 $1=j {print $1,$2,$3}
:找到错误。