【问题标题】:Why can't I match the string?为什么我不能匹配字符串?
【发布时间】:2019-03-16 14:49:52
【问题描述】:

我的代码:

# (1)
#result='/usr/bin/which: no commandName in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wks/.local/bin:/home/wks/bin)'

# (2)
result=`which commandName`

echo $result

reg='commandName'

if [[ $result =~ $reg  ]]
then echo "exit"
else echo "not exit"
fi

如果我使用代码 (2),将打印 not exit,但如果我使用代码 (1),它将打印 exit

但是which commandName会在我的电脑上得到同样的内容,是的

/usr/bin/which: no commandName in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wks/.local/bin:/home/wks/bin)

那么不同行为的原因是什么?

【问题讨论】:

  • `` 用于执行另一个命令,例如:var=`ls /home/`->(2): 应该做什么,我得到命令未找到。

标签: bash shell


【解决方案1】:

问题在于,在您的代码 (2) 中,result 最终为空。

/usr/bin/which: no commandName ... 是一条错误消息,因此写入 stderr。反引号(如`which ...`)仅捕获标准输出,不捕获错误。

如果您想同时捕获标准输出和标准错误,请执行以下操作

result=$(which commandName 2>&1)

【讨论】:

  • 它是对的,用 echo $result ,我确实看到了一行空白
【解决方案2】:

在 bash 中,在哪个变量 $? 后面的行中使用?检查最后一个命令是如何结束的,即“which”,第二个测试只有在返回码为 0 时才执行,代码 1 表示命令失败。

res=`which asasa`
if [[ $? -eq 0 ]]
then
#etc.

【讨论】:

  • 我知道这行得通,但我想知道为什么我提到的代码不起作用
  • 因为结果包含字符串"/usr/bin/which:no commandName in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin: /home/wks/.local/bin:/home/wks/bin)" 而不是你所期望的字符串"commandName"。
  • 但我用 =~ 表示字符串是否包含正确的字符串
  • w bash =~ 表示stringA与stringB不对应
  • 但是如果我使用代码 (1) 将值 "/usr/bin/which: no commandName in...." 给 $result ,它将打印 "exit" ,这意味着包含
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
相关资源
最近更新 更多