【问题标题】:Using system commands with echo in bash file [duplicate]在bash文件中使用带有echo的系统命令[重复]
【发布时间】:2016-02-16 00:20:47
【问题描述】:

我一直在通过论坛搜索解决此问题的方法,但我遇到的所有问题都超出了我的标准,或者无法解决我的问题。我正在尝试做的是非常基本的,但似乎无法让它在 unix 中工作。我目前正在使用 unix 中的 bash 脚本,但我无法让 if 语句和 echo 命令正常工作。

尝试获取 if 语句以在其中运行系统命令,并且每次我遇到找不到命令的错误时。 (即:whoami:找不到命令。) echo 命令也有同样的问题。 (即:w: command not found。)我知道这些命令会起作用,因为我可以将它们放入命令行,它们会返回我正在寻找的值。

function userprocess {
if [[ $(whoami | grep $EUIDS) = $EUIDS ]]
then
        echo -e "==> Active processes for $EUIDS \050 Logged in \0051:"
        echo "$(w -h $EUIDS)"
else
        echo -e  "==> Active processes for $EUIDS \0050 NOT logged in \0051:"
        echo "$(w -h $EUIDS)"
fi
}

我试过了

function userprocess {
if [[ ${command[whoami | grep $EUIDS]} = $EUIDS ]]
then
        echo -e "==> Active processes for $EUIDS \050 Logged in \0051:"
        echo ${command[w -h $EUIDS]}
else
        echo -e  "==> Active processes for $EUIDS \0050 NOT logged in \0051:"
        echo ${command[w -h $EUIDS]}
fi
}

还有这个……

function userprocess {
if [[ 'whoami | grep $EUIDS' = $EUIDS ]]
then
        echo -e "==> Active processes for $EUIDS \050 Logged in \0051:"
        echo 'w -h $EUIDS'
else
        echo -e  "==> Active processes for $EUIDS \0050 NOT logged in \0051:"
        echo 'w -h $EUIDS'
fi
}

我在这里做错了什么?有时我得到正确的输出只是为了得到一个等于 $EUIDS 的错误令牌。我已经走到了尽头,我需要一条生命线来完成这件事。

【问题讨论】:

  • 什么样的Unix?你用的是什么外壳?您正在使用 Bash 语法,但您确定这是在 bash 下运行的吗?通常,当您echo 一个命令时,它只会将您在引号中的内容准确地打印到终端。运行命令并显示输出的正确方法是只使用w -h $EUIDS,而不是echo "echo $(w -h $EUIDS)"echo 'w -h $EUIDS'
  • ok bash 版本 4.2.25 GNU bash 并且不确定 unix 版本(可能是 i686-pc-linux-gnu)并且只输入 w -h $EUIDS 会给我错误 w: command not recognized。还使用 #! 的包含/bin/bash
  • 发现 unix 版本为 3.2.0-97-generic #137-Ubuntu
  • 我不确切知道您要做什么(可能有更好的方法),但根据经验:在Bash 中,单引号'' 不转义任何东西,所以当你想做echo "w -h $EUIDS"之类的事情时,请使用双引号。关于if,你为什么不试试这个:if [ "$(whoami | grep $EUIDS)" = "$EUIDS" ]; then ...
  • 啊,天哪,这是一些变量中该死的大写字母。浏览脚本并将所有变量转换为小写,中提琴!过度写入 PATH 是问题所在。好吧,对于新手用户来说,为什么大多数 bash 教程都是用大写的变量名编码的?谢谢一百万,我会修复的。

标签: bash shell unix if-statement echo


【解决方案1】:

好吧,问题不在于代码的语法,而在于变量名。我的大多数变量名都是大写的,这导致 PATH 等内容被覆盖。 例如:

PATH=$(pwd)

这将覆盖。 你需要这样做:

path=$(pwd)

代码 sn-p 的正确语法是这样的:

function userprocess {
if [ "$(users | grep -c $euids)" = "$euids" ]
then
        echo -e "==> Active processes for $euids \050 Logged in \0051:"
        w -h $euids
else
        echo -e  "==> Active processes for $euids \0050 NOT logged in \0051:"
        w -h $euids
fi
}

感谢大家对此问题的意见!干杯!

【讨论】:

  • 您仍然不应该使用echo $(stuff),除非您特别希望shell 对命令stuff 的输出执行空格标记化和通配符扩展。简单地运行一个命令就会产生它的输出就好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多