Unix shell命令中的问题

Unix shell命令中的问题,unix,shell,awk,Unix,Shell,Awk,我正在命令行上尝试以下命令 ps -u `id | cut -f2 -d"=" | cut -f1 -d"("` -f | grep ppLSN | awk '{print $9}' | awk '{FS="=";print $2}' | grep KLMN | wc -l 命令的值返回为7 但是当我把同样的命令放在下面的脚本中时 ps -u `id | cut -f2 -d"=" | cut -f1 -d"("` -f | grep ppLSN | awk '{print $9}' |

我正在命令行上尝试以下命令

ps -u `id | cut -f2 -d"=" | cut -f1 -d"("`  -f | grep ppLSN | awk '{print $9}' | awk '{FS="=";print $2}' | grep KLMN | wc -l
命令的值返回为7

但是当我把同样的命令放在下面的脚本中时

ps -u `id | cut -f2 -d"=" | cut -f1 -d"("`  -f | grep ppLSN | awk '{print $9}' | awk '{FS="=";print $2}' | grep $XYZ | wc -l
我在命令行上以abc_sh XYZ=KLMN的形式调用脚本,但它不工作,返回0 问题在于命令grep$XYZ中的grep
有人能告诉我为什么不起作用吗?

因为脚本的$1变量第一个参数设置为XYZ=KLMN

只需使用abc_sh KLMN和grep$1而不是grep$XYZ

假设我们在这里讨论的是bash

另一种选择是定义一个临时环境变量,在这种情况下,您必须这样调用它:XYZ=KLMN abc_sh

编辑:

找到了您正在使用的,您必须使用set-k参见BASH手册中的SHELL内置命令

          -k      All arguments in the form of assignment  statements  are
                  placed  in the environment for a command, not just those
                  that precede the command name.
所以


因此,在启动脚本bashrc或profile的某个地方可能已经设置了-k。

尝试以下任一方法来设置临时环境变量:

XYZ=KLMN abc_sh
env XYZ=KLMN abc_sh
(export XYZ=KLMN; abc_sh)

您正在使用这么多链接在一起的命令

ps -u `id -u` -f |  awk -v x="$XYZ" -v p="ppLSN" '$0~p{
 m=split($9,a,"=")
 if(a[2]~x){count++} 
}
END{print count}'
将此脚本称为:

#!/bin/ksh
ps -u $(id -u) -o args | grep $XYZ | cut -f2- -d " "
像这样:

XYZ=KLMN abc_sh

首先,不要使用不必要的剪切,而是使用id-u。糟糕的问题是,为什么要隐藏相关信息?首先,它在没有提到这一点之前就工作了,然后你使用的是ksh,而不是通常的bash,也没有提到这一点。把它放在开头:ps-f-u。。。我在这里使用单独的连字符纯粹是为了美观。有一个限制,我不应该像你说的abc_sh KLMN那样称呼脚本。你应该这么说,但无论如何,这样做的方法已经得到了两次回答。这是一个已经存在的脚本,它将像那样被调用,只有abc_sh XYZ=KLMN,现在我使用这个变量XYZ。但是这不起作用。即使我在脚本中的命令之前回显$XYZ,它也不会显示任何内容。而且这个变量已经在脚本中的一些其他位置使用已经可以正常工作了。您是否使用XYZ=KLMN abc\u sh而不是abc\u sh XYZ=KLMN?为什么不同时粘贴原始脚本?你在用BASH吗?嗅觉障碍:
XYZ=KLMN abc_sh