【问题标题】:problem in a shell commandshell命令中的问题
【发布时间】:2009-10-15 05:07:46
【问题描述】:

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

ps -u `id | cut -f2 -d"=" | cut -f1 -d"("`  -f | grep ppLSN | awk '{print $9}' | awk '{FS="=";print $2}' | grep KLMN | wc -l

命令的值返回为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 谁能告诉我为什么这不起作用?

【问题讨论】:

  • 首先,使用 id -u 代替不必要的切割。
  • 可怕的问题,你为什么要隐藏相关信息?首先它之前工作过(没有提及),然后您使用的是 ksh,而不是 bash(通常),也没有提及。
  • 在命令扩展之后将-f 参数分离到右侧,使其在混乱中丢失。放在开头:ps -f -u ...(我在这里使用单独的连字符纯粹是为了,呃,“美学”)。

标签: unix shell awk


【解决方案1】:

因为您的 $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 或配置文件)中有set -k

【讨论】:

  • 有一个约束,我不应该像你所说的那样调用脚本 abc_sh KLMN。
  • 你应该这么说,但无论如何,这样做的方法已经回答了两次
  • 这是一个已经存在的脚本,它只会被称为 abc_sh XYZ=KLMN,现在我正在使用这个变量 XYZ。但这不起作用。即使我在脚本中的命令它不显示任何内容。并且该变量已在脚本中的其他一些地方使用,它已经可以正常工作。
  • 您是否使用“XYZ=KLMN abc_sh”而不是“abc_sh XYZ=KLMN”?
  • 为什么不把原来的脚本也粘贴一下呢?你在使用 BASH 吗?
【解决方案2】:

尝试以下任何一种设置临时环境变量:

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

【讨论】:

【解决方案3】:

你使用了这么多链接在一起的命令....

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

【讨论】:

    【解决方案4】:

    调用这个脚本:

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

    像这样:

    XYZ=KLMN abc_sh
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多