Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将命令行参数传递给gawk脚本_Bash_Shell_Awk_Sed - Fatal编程技术网

Bash 将命令行参数传递给gawk脚本

Bash 将命令行参数传递给gawk脚本,bash,shell,awk,sed,Bash,Shell,Awk,Sed,我有一个脚本chk.awk,我想向它传递一些命令行参数。它有awk语句、sed命令等。举个例子,我在下面取了一个小程序,希望将命令行参数传递给它 #!/bin/bash var1=$1 gawk ' BEGIN { printf "argc = %d\n argv0=%s\n argv1=%s\n var1=%s\n",ARGC,ARGV[0],ARGV[1],$var1 }' 但当我尝试时: $ sh chk.awk 10 20 argc = 1 argv0=gawk arg

我有一个脚本
chk.awk
,我想向它传递一些命令行参数。它有
awk
语句、
sed
命令等。举个例子,我在下面取了一个小程序,希望将命令行参数传递给它

#!/bin/bash
var1=$1
gawk '
BEGIN {
        printf "argc = %d\n argv0=%s\n argv1=%s\n var1=%s\n",ARGC,ARGV[0],ARGV[1],$var1
}'
但当我尝试时:

$ sh chk.awk 10 20
argc = 1
argv0=gawk
argv1=
var1=

在上面,我尝试通过两种方式显示命令行参数,即
argv
&
$1
,但它们都不起作用。有人能告诉我哪里出了问题吗?正确的方法是什么?

问题是您为shell脚本提供参数,而不是为awk脚本提供参数。 您必须将
“$@”
添加到
gawk
的调用中

#!/bin/bash
var1=$1
gawk '
BEGIN {
    printf "argc = %d\n argv0=%s\n argv1=%s\n var1=%s\n",ARGC,ARGV[0],ARGV[1],$var1
}' "$@" 
否则,您将在shell脚本中保存您的参数,这些参数将不会传递给
gawk

#!/bin/bash
var1=$1
gawk '
BEGIN {
    printf "argc = %d\n argv0=%s\n argv1=%s\n var1=%s\n",ARGC,ARGV[0],ARGV[1],$var1
}' "$@" 
更新1

如果您有其他参数(例如要处理的文件名), 必须首先删除args的第一个部分(在
BEGIN
部分):


@楚斌:非常感谢。这是可行的,但还有另一个问题。我在程序中使用输入和输出文件,如:#/bin/bash var1=$1 gawk'BEGIN{printf“argc=%d\n argv0=%s\n argv1=%s\n var1=%s\n\n argc,ARGV[0],ARGV[1],$var1}{print$0}''$@“in.file>out.file运行此脚本时,出现以下错误:$sh chk.awk 10 gawk:cmd。第2行:致命:无法打开文件“10”进行读取(没有这样的文件或目录)是否可以更新如何传递参数10here@user1182722:处理后,应删除开始部分中的第一个参数it@Chubin:非常感谢你的帮助。成功了:)