Сравнение двух строк в Bash

Вы могли использовать a udev правило и fbset для принуждения разрешения кадрового буфера на обоих дисплеях, которые могут пойти некоторым путем к достижению, что Вы после.

udev правило было бы вроде /etc/udev/rules.d/81-framebuffer-hack.rules:

KERNEL=="card0-DVI", SUBSYSTEM=="drm", ATTR{dpms}=="On", ATTR{enabled}=="enabled", ATTR{status}=="connected", RUN+="/usr/sbin/fbset -g 1920 1080 1920 1080 32"

Можно читать на специфических особенностях udev правила о Записи udev управляют страницей.

22
18.07.2014, 13:16
3 ответа

-eq - арифметический оператор, который сравнивает два числа.

Используйте = (переносной/стандартный sh), =~ или == вместо него.

Также используйте кавычки, так как если ${PACKAGENAME} содержит пробел или символ подстановки, то он будет разбит на несколько аргументов, что заставит [ увидеть больше аргументов, чем желательно. Смотрите здесь список общих ловушек бэша. См.

if [ "${PACKAGENAME}" = 'kakadu-v6_4-00902C' ]; then
    echo "successfully entered if block!!"
fi

См. man bash, поиск (/) для CONDITIONAL EXPRESSIONS.

31
27.01.2020, 19:42

Замените -eq на ==, чтобы ваш блок был таким:-

if [ ${PACKAGENAME} == kakadu-v6_4-00902C ]; then

        echo "successfully entered if block!!"

fi
6
27.01.2020, 19:42

Другой способ их аннулировать:

: ${PACKAGENAME:?'$PACKAGENAME variable is empty!'} #emits error and exits
[ -z "${PACKAGENAME#kakadu-v6_4-00902C}" ] || { #if var - str not empty do block
    echo '$PACKAGENAME is not kakadu-v6_4-00902C' 
    exit 1
} >&2

Вышеуказанный блок сначала проверяет, имеет ли вообще "$PACKAGENAME" какое-либо значение, а если нет, то выходит с ошибкой и эхом ? this'} на stderr. Если родительская оболочка все еще существует, то тест пройден, а затем проверяется, если при удалении вашей строки 'kakadu...' из переменной получается пустая строка -z. Если нет, то снова выдаётся ошибка и выходит из оболочки. Если Ваша оболочка все еще существует в этот момент после выполнения блока, то в противном случае это не так.

Вероятно, такие вещи лучше всего реализовывать в функции. Например:

argeq() ( i= : ${2?^MERR: not enough parameters!} #$#>=2 || quit w/ err ^M == \r
    z() { return $((${#1}>0)) ; } #return 1 if ${#1}>0 else 0
    until z "${2+?}" $((i=i+1)) #until $2 is not set...
    do  ! z "$1" && z "${1#"$2"}" || #$1 != '' && $1 - $2 == '' or...
        exit $((i${1:++1})) #exit $? == failed arg count
    shift ; done #shift away one param ; continue loop
)

С помощью этой функции вы можете предоставить столько аргументов, сколько позволит ваша система. Если вы предоставите меньше 2, то она вернет 1 и выдаст сообщение на stderr. Если вы предоставите 2 или более аргументов, то она будет обрабатывать все как строки и вернет 0, если все одинаковые и не нулевые, то вернет номер аргумента, который первым не прошел проверку.

В вашем случае она может быть использована как:

{   
    PACKAGENAME='kakadu-v6_4-00902C'
    argeq "$PACKAGENAME" kakadu-v6_4-00902C &&
        echo "kakadu-v6_4-00902C == $PACKAGENAME" ||
        echo failure
    ! argeq "${PACKAGENAME#*-}" kakadu-v6_4-00902C &&
        echo "kakadu-v6_4-00902C != ${PACKAGENAME#*-}" ||
        echo failure
}

###OUTPUT###
kakadu-v6_4-00902C == kakadu-v6_4-00902C
kakadu-v6_4-00902C != v6_4-00902C

Для дальнейшей демонстрации я напишу другую функцию:

aeqecho() { i=$((i+1)) #inc for line#
    argeq "$@" && echo "$i : yay" || #allswell or
    ! e=$? ${2+:} return || #save $?; ! exclusive || to drop ERRs
    echo "$i : shite - arg$e failed" #report failure
}

DEMO:

{  i= s=string
   aeqecho $s #1
   aeqecho $s $s #2
   aeqecho "$s $s" #3
   aeqecho "$s $s" "${s} string" #4
   aeqecho "${s}1" $s string #5
   aeqecho "" "" "" #6
   aeqecho "" "$s" $s #7
   aeqecho 1 "${s#$s}1" $((2-1)) #8                     
   aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9  
   aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10
}  

OUTPUT:

ERR: not enough parameters!
2 : yay
ERR: not enough parameters!
4 : yay
5 : shite - arg2 failed
6 : shite - arg1 failed
7 : shite - arg1 failed
8 : yay
9 : shite - arg13 failed
10 : yay
4
27.01.2020, 19:42

Теги

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