Могу ли я использовать операторы сравнения на всякий случай?

Как видите, процесс redis выполняется в собственном «пространстве имен монтирования» с параметром только для чтения.

Redis proc started by Systemd [/proc/15920/ns/mnt] -> mnt:[4026532343]

your shell [/proc/7138/ns/mnt] -> mnt:[4026531840]

Посмотрите на модуль systemd для параметров запуска и обновления redis-server , связанных с флагами монтирования, в соответствии с вашими потребностями.

Посмотрев на файл модуля systemd redis-server, я вижу настройки ниже

# grep -i readwrite /etc/systemd/system/redis.service 
ReadWriteDirectories=-/var/lib/redis
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/var/run/redis
ReadWriteDirectories=-/etc/redis

, поэтому вы можете добавить / myraid0 в качестве дополнительных ReadWriteDirectories и перезапустить службу redis

2
08.08.2017, 05:02
4 ответа

Вы можете сопоставить значение с диапазоном, а затем используйте порядковый номер этого диапазона в операторе case:

cmil_limits=(320 404 510 642)
index=0
for limit in "${cmil_limits[@]}"
do
        if [ "$cmils" -lt "$limit" ]
        then
                break
        fi
        ((index++))
done
case "$index" in
   0)                   # < 320
        cawg="??"
        ;;
   1)                   # 320-403
        cawg="25 AWG"
        ;;
   2)                   # 404-509
        cawg="24 AWG"
        ;;
   3)                   # 510-641
        cawg="23 AWG"
        ;;
   4)                   # > 641
        cawg="??"
        ;;
esac

Если $cmilsменьше 320, мы выходим из цикла forна его первой итерации,с index=0. Если $cmilsравно ≮ 320 (, т. е. ≥ 320 ), мы увеличиваемindex(→1)и переходим к следующей итерации. Затем, если $cmils< 404 (, т. е. ≤ 403, при условии, что это целое число ), мы выходим из цикла с помощью index=1. И так далее. Если $cmilsравно ≮ 642, это ≥ 642 и, следовательно, > 641, поэтому мы доходим до конца цикла forи получаем index=4.

Это имеет то преимущество, что значения отсечки сохраняются вместе, все на одной линии, и вам не нужно поддерживать избыточные номера (например, ваш текущий код и код одного другого ответа перечисляют и 403 , и 404, и и 509 и 510 — что избыточно, и больше работы для поддержания, если цифры когда-либо изменятся. Я не знаю, является ли это настоящей -мировой заботой.)


cmil_limits— это массив. bash, ksh и некоторые другие оболочки поддерживают массивы, а некоторые нет. Если вам нужно сделать что-то подобное в оболочке, которая не поддерживает массивы, вы можете просто поместить список прямо в оператор for:

for limit in 320 404 510 642
do
    ︙

или используйте список параметров оболочки в виде массива:

set -- 320 404 510 642
for limit in "$@"
do
    ︙

Некоторые оболочки позволяют сокращать приведенное выше:

set -- 320 404 510 642
for limit
do
    ︙

((…))арифметика также является башизмом (как letвысказывание ). Если вам нужно сделать что-то подобное в оболочке который не поддерживает ((…))арифметику, вы можете заменить

        ((index++))
Оператор

(для увеличенияindex)на

        index=$(expr "$index" + 1)

Обратите внимание, что пробелы до и после +обязательны.

1
27.01.2020, 21:48
case $cmils in

    3[2-9][0-9]|40[0-3])
        cawg="25 AWG"
        ;;
    40[4-9]|4[1-9][0-9]|50[0-9])
        cawg="24 AWG"
        ;;
    51[0-9]|6[0-3][0-9]|64[01])
        cawg="23 AWG"
        ;;
5
27.01.2020, 21:48

Оболочка POSIX

Поскольку вы ищете арифметические тесты, а регистр не выполняет арифметические действия, if-thenкажется естественным подходом:

if [ "$cmils" -lt 320 ]
then
        cawg="??"
elif [ "$cmils" -le 403 ]
then
        cawg="25 AWG"
elif [ "$cmils" -le 509 ]
then
        cawg="24 AWG"
elif [ "$cmils" -le 641 ]
then
        cawg="23 AWG"
fi

Только Bash

Я предпочитаю портативные решения, но некоторым нравится арифметический синтаксис bash:

if ((cmils < 320))
then
        cawg="??"
elif ((cmils <= 403))
then
        cawg="25 AWG"
elif ((cmils <= 509))
then
        cawg="24 AWG"
elif ((cmils <= 641))
then
        cawg="23 AWG"
fi

Этот синтаксис более мощный и более хрупкий, чем синтаксис POSIX. Чтобы понять почему, попробуйте этот код после установки cmils=cmils.

10
27.01.2020, 21:48

Как уже говорили другие, caseне поддерживает операторы сравнения, только сопоставление с шаблоном.

Однако вы можете сделать набор операторов if/elif/fi более похожим на оператор case , отформатировав его по-другому. например, на основе ответа John1024:

if   [ "$cmils" -lt 320 ]; then cawg='??'
elif [ "$cmils" -le 403 ]; then cawg='25 AWG'
elif [ "$cmils" -le 509 ]; then cawg='24 AWG'
elif [ "$cmils" -le 641 ]; then cawg='23 AWG'
fi

или даже:

[ "$cmils" -ge 320 ] && [ "$cmills" -le 403 ] && cawg='25 AWG'
[ "$cmils" -ge 404 ] && [ "$cmills" -le 509 ] && cawg='24 AWG'
[ "$cmils" -ge 510 ] && [ "$cmills" -le 641 ] && cawg='23 AWG'

ПРИМЕЧАНИЕ.:в отличие от всего, что использует elif, этот вариант имеет тот недостаток, что выполняется по крайней мере первая проверка каждой из этих строк. Использование elifпропустит все оставшиеся тесты после того, как любой тест будет оценен как истинный. Вы можете поместить что-то подобное в функцию и добавить && returnпосле установки cawg.

Я лично нахожу любой из них гораздо более читабельным (без всех дополнительных переводов строки и чередующихся отступов, загромождающих вещи ), но мнения сильно различаются по этому конкретному -вопросу стиля кодирования/отступа:)

Когда все выстраивается в одни и те же (или очень близкие )столбцы, их также легче копировать, вставлять и редактировать. Что хорошо при использовании одного настоящего редактора.

5
27.01.2020, 21:48

Теги

Похожие вопросы