Bash将命令输出与字符串进行比较[重复]

Posted

技术标签:

【中文标题】Bash将命令输出与字符串进行比较[重复]【英文标题】:Bash compare a command output to string [duplicate] 【发布时间】:2019-08-20 20:36:42 【问题描述】:

输出是一样的,它总是回显need to pull。 如果我在if 条件中删除$text 周围的引号,则会引发too many arguments 错误。

var="$(git status -uno)" && 

text="On branch master Your branch is up-to-date with 'origin/master'. nothing to commit (use -u to show untracked files)"; 

echo  $var; 
echo  $text; 
if [ "$var" = "$text" ]; then
    echo "Up-to-date"
else
    echo "need to pull"
fi

【问题讨论】:

git status 的输出不是单行文本。一般来说,这是编写 git 脚本的一种非常脆弱的方法——不能保证 git status 的输出在 git 版本之间不会发生变化。更好的方法是使用git status --porcelain(参见docs)。 当我针对最新分支发出git status -uno 时,git status 的返回值中包含换行符。您的 $text 变量中似乎没有考虑这些。 【参考方案1】:

最好这样做,=~ 用于 bash 正则表达式

#!/bin/bash

var="$(git status -uno)" 

if [[ $var =~ "nothing to commit" ]]; then
    echo "Up-to-date"
else
    echo "need to pull"
fi

#!/bin/bash

var="$(git status -uno)" 

if [[ $var == *nothing\ to\ commit* ]]; then
    echo "Up-to-date"
else
    echo "need to pull"
fi

【讨论】:

bash regex 是性能杀手! 新脚本更快 =~ 是什么意思? 帖子已相应编辑【参考方案2】:

警告:bash 的正则表达式需要更多资源,在其他shell 中不起作用!

简单的旧时尚

此语法与 POSIX 兼容,仅与 bash 不兼容!

if LANG=C git status -uno | grep -q up-to-date ; then
    echo "Nothing to do"
else
    echo "Need to upgrade"
fi

或者测试一个变量(posix 也是)

来自this answer to How to check if a string contains a substring in Bash,这是一个兼容的语法,在any 标准POSIX shell下工作:

#!/bin/sh

stringContain()  [ -z "$2##*$1*" ] &&  [ -z "$1" ] || [ -n "$2" ] ; ; 

var=$(git status -uno)

if  stringContain "up-to-date" "$var" ;then
    echo "Up-to-date"
    # Don't do anything
else
    echo "need to pull"
    # Ask for upgrade, see: 
fi

【讨论】:

以重复的形式结束问题(尽管如此)回答它有点奇怪,不是吗? @BenjaminW。我同意,已经很晚了,我自发地回答,然后我意识到:任务的标题代表命令的输出,但问题itefl是关于*变量检查“......

以上是关于Bash将命令输出与字符串进行比较[重复]的主要内容,如果未能解决你的问题,请参考以下文章

查找与模式匹配的文件,替换字符串,然后将输出与原始文件进行比较,命令失败

如何将字符串与 Bash 中的多个正确值进行比较?

Bash命令输出未保存到文本文件或变量[重复]

BASH将Linux版本与数字进行比较? [重复]

通过回声管道将python变量(字符串)传递给bash命令[重复]

将字符串数组与变量Java进行比较[重复]