繁体   English   中英

linux shell 脚本中的一行 if/else 条件

[英]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...then语句

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

使用 OR 运算符

( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM