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将命令输出与字符串进行比较[重复]的主要内容,如果未能解决你的问题,请参考以下文章
查找与模式匹配的文件,替换字符串,然后将输出与原始文件进行比较,命令失败