我有一个循环遍历多个服务器的脚本,如果找到特定用户,它将输出他们的名字。我想修改单个语句,以便在未找到用户的情况下输出“NO USER IDENTIFIED
”。
以下是单独的代码段:
echo "environment1" sshpass -p $ldappw ssh $ldapuser@12.34.567.65 'mysql -h website.com -u topuser -ppassword dbname-e "select concat(FIRST,LAST) from users;"' | grep -i ${username}
我希望社群能够在修改声明方面给予我所需的输出。
答案 0 :(得分:0)
一个简单的解决方案就是写下这个:
echo "environment1" sshpass -p $ldappw ssh $ldapuser@12.34.567.65 'mysql -h website.com -u topuser -ppassword dbname-e "select concat(FIRST,LAST) from users;"' | (grep -i ${username} || echo "NO USER IDENTIFIED")
<强>解释强>
当Etan指出它时,如果没有选择行,grep会返回失败。这就是grep manual对此的说法:
如果找到选定的行,则退出状态为0,否则为1 找到。如果发生错误,退出状态为2。
仅当左侧为假时,Bash才会评估||
的右侧。正如bash manual所说:
&amp;&amp;和||运算符如果值为,则不计算expression2 expression1足以确定整个的返回值 条件表达式。
因此,如果grep无法选择与${username}
匹配的行,echo
将完成此任务。
备注强>
select concat(FIRST,LAST) from users where concat(FIRST,LAST) like '%${username}%;'
。有了这个技巧,你可以在grep之前做一个完全匹配(只需从中删除%
个字符)。-N
(不要在结果中写列名。)和mysql的-s
(静默模式。)参数,因此产生的输出较少。