shell命令中的问题

时间:2009-10-15 05:07:47

标签: 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

teh命令的值返回为7

但是当我将相同的命令放在脚本abc_sh中时,如下所示

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 任何人都可以告诉为什么这不起作用?

4 个答案:

答案 0 :(得分:3)

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

只需使用abc_sh KLMNgrep $1代替grep $XYZ

(假设我们在这里谈论bash)

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

编辑:

找到您正在使用的内容,您必须使用set -k(请参阅BASH手册中的SHELL BUILTIN COMMANDS)

          -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.

所以

vinko@parrot:~$ more abc
#!/bin/bash
echo $XYZ
vinko@parrot:~$ set -k
vinko@parrot:~$ ./abc XYZ=KLMN
KLMN
vinko@parrot:~$ set +k
vinko@parrot:~$ ./abc XYZ=KLMN

vinko@parrot:~$

因此,这个工作的地方可能在其中一个启动脚本(bashrc或profile。)中有set -k

答案 1 :(得分:2)

尝试其中任何一个来设置临时环境变量:

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

答案 2 :(得分:1)

你正在使用如此多的链接在一起的命令......

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}'

答案 3 :(得分:0)

调用此脚本:

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

像这样:

XYZ=KLMN abc_sh