59

我想在一行 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 部分包含到我的命令中呢?提前谢谢你的帮助。

4

4 回答 4

54

看起来好像你走在了正确的轨道上。您只需要在“;”之后添加 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 时,您使用了反引号“`”而不是单引号“'”,这可能会导致问题。

于 2013-08-12T05:26:46.650 回答
44

总结其他答案,一般用途:

多行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 运算符评估上一个操作的结果代码是否等于真/成功 ( 0)。因此,如果自定义函数返回其他内容(或根本不返回任何内容),您可能会遇到 AND/OR 速记的问题。在这种情况下,您可能需要用( a && b )( [ a == 'EXPECTEDRESULT' ] && b )替换类似的东西。

另请注意,(and[在技术上是命令,因此它们周围需要空格。

您也可以在类似的子shell中运行语句,而不是一组&&语句,尽管这样效率较低。做类似的事情也是如此,而不是。虽然在那个时候你会更多地进入不那么紧凑的多行内容。then a && b; elsethen $( a; b ); elseresult1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ]( foo && a && b ) || ( bar && c && d )

于 2018-12-23T01:08:41.870 回答
5

这不是问题的直接答案,但您可以使用 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."
于 2013-08-12T05:38:59.797 回答
1

你可以像下面这样使用:

(( 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”一书中找到了感兴趣的东西

于 2020-08-11T08:36:35.413 回答