shell脚本中的命令不起作用,但是在终端中工作的个别命令

时间:2016-05-18 17:04:37

标签: 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}' file.txt

所有内容都打印出来

1 个答案:

答案 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"

但不是这一个,将MyDocument.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}:找到错误。