[英]One line if/else condition in linux shell scripting
我想在一行 if/else 条件中包含以下内容。
$maxline=`cat journald.conf | grep "#SystemMaxUse="`
if [ $maxline == "#SystemMaxUse=" ]
then
sed 's/\#SystemMaxUse=/SystemMaxUse=50M/g' journald.conf > journald.conf2
mv journald.conf2 journald.conf;
else
echo "This file has been edited. You'll need to do it manually."
fi
我正在尝试将其放入单行命令中。 到目前为止,除了命令的 else 部分之外,我已经掌握了所有内容。 这是我到目前为止...
maxline=`cat journald.conf | grep "#SystemMaxUse="` && if [ $maxline == "#SystemMaxUse=" ]; then sed 's/\#SystemMaxUse=/SystemMaxUse=50M/g' journald.conf > journald.conf2 && mv journald.conf2 journald.conf; fi
那么如何将上述代码的 else 部分包含到我的命令中呢? 提前谢谢你的帮助。
看起来你走在正确的轨道上。 您只需要在“;”之后添加 else 语句遵循“then”语句。 此外,我会用分号将第一行与第二行分开,而不是用“&&”连接它。
maxline='cat journald.conf | grep "#SystemMaxUse="'; if [ $maxline == "#SystemMaxUse=" ]; then sed 's/\#SystemMaxUse=/SystemMaxUse=50M/g' journald.conf > journald.conf2 && mv journald.conf2 journald.conf; else echo "This file has been edited. You'll need to do it manually."; fi
同样在您的原始脚本中,在声明 maxline 时,您使用了反引号 "`" 而不是单引号 "'",这可能会导致问题。
总结其他答案,供一般用途:
if [ foo ]; then
a; b
elif [ bar ]; then
c; d
else
e; f
fi
if [ foo ]; then a && b; elif [ bar ]; c && d; else e && f; fi
( foo && a && b ) || ( bar && c && d ) || e && f;
请记住,AND 和 OR 运算符评估前一个操作的结果代码是否等于 true/success ( 0
)。 因此,如果自定义函数返回其他内容(或根本不返回任何内容),您可能会遇到 AND/OR 速记问题。 在这种情况下,您可能希望将( a && b )
类的内容替换为( [ a == 'EXPECTEDRESULT' ] && b )
等。
另请注意, (
和[
是技术上的命令,因此它们周围需要空格。
而不是像then a && b; else
那样的一组&&
语句then a && b; else
then a && b; else
,您也可以在子shell中运行语句,例如then $( a; b ); else
then $( a; b ); else
,尽管这效率较低。 做类似result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ]
事情也是如此result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ]
result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ]
result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ]
而不是( foo && a && b ) || ( bar && c && d )
( foo && a && b ) || ( bar && c && d )
。 虽然到那时你会更多地进入不那么紧凑的多行内容。
这不是问题的直接答案,但您可以使用 OR 运算符
( grep "#SystemMaxUse=" journald.conf > /dev/null && sed -i 's/\#SystemMaxUse=/SystemMaxUse=50M/g' journald.conf ) || echo "This file has been edited. You'll need to do it manually."
您可以像下面这样使用:
(( var0 = var1<98?9:21 ))
一样
if [ "$var1" -lt 98 ]; then
var0=9
else
var0=21
fi
延伸
condition?result-if-true:result-if-false
我在“Advanced Bash-Scripting Guide”一书中找到了感兴趣的东西
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.