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

时间:2013-08-12 05:13:31

标签: linux shell if-statement

如果/ 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  

我试图把它放到一行命令中。到目前为止,除了命令的其他部分,我已经完成了所有操作。这是我到目前为止所拥有的......

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 个答案:

答案 0 :(得分:24)

看起来你是在正确的轨道上。你只需要在“;”之后添加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

同样在您的原始脚本中,在声明maxline时,您使用了反向标记“”而不是单引号“'”,这可能会导致问题。

答案 1 :(得分: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."

答案 2 :(得分:3)

总结其他答案,供一般使用:

多行 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 /成功(0)。因此,如果自定义函数返回其他内容(或根本不返回任何内容),则AND / OR速记可能会出现问题。在这种情况下,您可能需要将( a && b )等替换为( [ a == 'EXPECTEDRESULT' ] && b )等。

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

您也可以在诸如&&之类的子外壳中运行语句,而不是像then a && b; else这样的一组then $( a; b ); else语句,尽管这样做效率较低。做类似result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ]而不是( foo && a && b ) || ( bar && c && d )的事情也是如此。尽管到那时,无论如何,您将越来越多地进入不太紧凑的多行内容。

答案 3 :(得分:-1)

您可以像下面这样使用:

(( var0 = var1<98?9:21 ))

相同
if [ "$var1" -lt 98 ]
then
var0=9
else
var0=21
fi

扩展

condition?result-if-true:result-if-false

我在《高级Bash脚本指南》一书中找到了感兴趣的东西