Одна строка, если /else условие в сценариях linux shell
Я хотел бы иметь эквивариантность следующего в одной строке, если условие /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 вышеуказанного кода в мою команду? Благодарим вас за помощь.
Ответы
Ответ 1
Похоже, вы на правильном пути. Вам просто нужно добавить инструкцию 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
Также в вашем исходном script при объявлении maxline вы использовали обратные тики "`" вместо одиночных кавычек "", которые могут вызвать проблемы.
Ответ 2
Это не прямой ответ на вопрос, но вы можете просто использовать OR-operator
( 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."
Ответ 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
Использование оператора ИЛИ
( 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
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" ]
вместо ( foo && a && b ) || ( bar && c && d )
( foo && a && b ) || ( bar && c && d )
. Хотя в этот момент вы все равно получите больше от менее компактных многострочных программ.