Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.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 Awk将命令输出插入到变量中_Bash_If Statement_Awk - Fatal编程技术网

Bash Awk将命令输出插入到变量中

Bash Awk将命令输出插入到变量中,bash,if-statement,awk,Bash,If Statement,Awk,我试图将下面的输出插入变量x。输出是一个字符串。我以前做过这件事 k="psz" 当我这样做的时候,它工作了,当我做echo$x时,我得到了预期的输出 x=$( awk -v a="k" -F '[:,]' '{ if($1 == "psz") print $5 }' /etc/passwd ) 但是当我试着用下面这个的时候,它不起作用 x=$( awk -v a="k" -F '[:,]' '{ if($1 == a) print $5 }' /etc/passwd ) 它不起作用,

我试图将下面的输出插入变量x。输出是一个字符串。我以前做过这件事

k="psz"
当我这样做的时候,它工作了,当我做echo$x时,我得到了预期的输出

x=$( awk -v a="k" -F '[:,]' '{ if($1 == "psz")  print $5 }' /etc/passwd )
但是当我试着用下面这个的时候,它不起作用

x=$( awk -v a="k" -F '[:,]' '{ if($1 == a)  print $5 }' /etc/passwd )
它不起作用,echo$x给了我一个空行。

您正在用字符串k而不是变量$k的值设置a。如果设置正确,代码将正常工作。看:

k='accdias'
x=$(awk -va=$k 'BEGIN{FS=":"} $1==a {print $5}' /etc/passwd)
echo $x
Antonio Dias
我编辑此文件是为了显示另一种不使用-v将变量值传递给awk程序的方法:

在上面的代码中,ARGV[0]将设置为awk,ARGV[1]将设置为/etc/passwd,最后ARGV[2]将设置为$k value,这是该示例中的accdias

Ed Morton的编辑见以下评论:

k='accdias'
x=$(awk -v a="$k" 'BEGIN{FS=":"} $1==a {print $5}' /etc/passwd)
echo "$x"
Antonio Dias

k='accdias'
x=$(awk 'BEGIN{FS=":"; a=ARGV[2]; ARGV[2]=""; ARGC--} $1==a {print $5}' /etc/passwd "$k")
echo "$x"
Antonio Dias
您正在使用字符串k而不是变量$k的值设置a。如果设置正确,代码将正常工作。看:

k='accdias'
x=$(awk -va=$k 'BEGIN{FS=":"} $1==a {print $5}' /etc/passwd)
echo $x
Antonio Dias
我编辑此文件是为了显示另一种不使用-v将变量值传递给awk程序的方法:

在上面的代码中,ARGV[0]将设置为awk,ARGV[1]将设置为/etc/passwd,最后ARGV[2]将设置为$k value,这是该示例中的accdias

Ed Morton的编辑见以下评论:

k='accdias'
x=$(awk -v a="$k" 'BEGIN{FS=":"} $1==a {print $5}' /etc/passwd)
echo "$x"
Antonio Dias

k='accdias'
x=$(awk 'BEGIN{FS=":"; a=ARGV[2]; ARGV[2]=""; ARGC--} $1==a {print $5}' /etc/passwd "$k")
echo "$x"
Antonio Dias

在第二个例子中,k在前面没有定义,如果$1==k,你的意思是如果$1==k?或者如果$1==a?测试应该是如果$1==a不是k,如果你想让a的值设置为k,那么你应该通过-va=$k。是的,你是对的!这不是k。这是一个错误,我打错了。问题仍然存在!检查我的答案。我猜你仍然在传递-va=k而不是-va=$k,正确的形式。在第二个形式中,k之前没有定义如果$1==k,你的意思是如果$1==k?或者如果$1==a?测试应该是如果$1==a不是k,如果你想让a的值设置为k,那么你应该通过-va=$k。是的,你是对的!这不是k。这是一个错误,我打错了。问题仍然存在!检查我的答案。我猜你还是通过了-va=k而不是-va=$k,这是正确的形式。是的,你是对的,我找到了。你知道我如何把if-else放进awk吗?你在你的OP中对if/else有正确的想法。只要{if$1==a{print$5}else{print no match}。祝你好运,别担心。关于if/else,如果条件{commands}else{commands},类似这样的操作就可以了。您必须引用shell变量,请参阅。如果读取后未将ARGV[2]设置为null,则awks将尝试像输入文件一样打开accdias,请参阅。另外,如果您没有在-v i.e.-va=$k后面加空格,那么脚本只会不必要地呆呆地看。@EdMorton,您在所有这些方面都是完全正确的!。谢谢你的提醒,如果你不介意的话,请你修改一下答案好吗?我不知道怎么做-是的,你是对的,我找到了。你知道我如何把if-else放进awk吗?你在你的OP中对if/else有正确的想法。只要{if$1==a{print$5}else{print no match}。祝你好运,别担心。关于if/else,如果条件{commands}else{commands},类似这样的操作就可以了。您必须引用shell变量,请参阅。如果读取后未将ARGV[2]设置为null,则awks将尝试像输入文件一样打开accdias,请参阅。另外,如果您没有在-v i.e.-va=$k后面加空格,那么脚本只会不必要地呆呆地看。@EdMorton,您在所有这些方面都是完全正确的!。谢谢你的提醒,如果你不介意的话,请你修改一下答案好吗?我不知道怎么做-