如果/ 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部分包含在我的命令中呢?感谢您的帮助。
答案 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 [ 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 /成功(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脚本指南》一书中找到了感兴趣的东西