Подтвердить что ты не робот

Bash, сравнение штрихов и строк

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

if [ "$var" == "string" ]
then
    do something
fi

Что такое переносимый способ сравнения строк с помощью /bin/sh? Я знаю, что всегда могу сделать что-то противоположное, используя! =, Но мне интересно о более чистом, портативном способе.

4b9b3361

Ответ 1

dash - очень строгая оболочка POSIX, если она работает в dash, почти наверняка она будет работать в другой оболочке POSIX.

Try:

if [ "$var" = "string" ]
then
    some_command
fi

Ответ 2

Почему существует вероятность того, что ваш script будет запущен "неправильной" оболочкой? Я думаю, вы могли бы сделать это предпосылкой своего продукта, используя стандартную строку sh-bang в верхней части вашего script:

#!/bin/bash

Даже если пользователь использует другую оболочку, другие оболочки, как правило, все еще существуют и, если нет, просто жалуются и заявляют, что они являются предварительными.

Точно так же, как определенный уровень ядра, или существование awk, может быть пред-req.

По вашему конкретному вопросу, я считаю, что sh и bash позволяют использовать сингл '=' для сравнения строк - это поведение POSIX:

if [ "a" = "a" ] ; then
    echo yes
fi

yes

Ответ 3

Используйте = вместо ==. Сравнение выполняется с помощью теста (1). /usr/bin/[ обычно является ссылкой на /usr/bin/test. Единственное отличие состоит в том, что если вы используете [ в оболочке script, требуется также ].

Обратите внимание, что bash имеет встроенный test/[, поэтому он фактически не использует /usr/bin/test.

Ответ 4

Ответы, уже опубликованные, безусловно верны, но, возможно, стоит отметить, что иногда расширение параметра может служить той же цели, возможно, с некоторой дополнительной гибкостью.

% p() { printf 'notvar = %b\n' "${notvar##"${string1}"}${string2}" ; }
% string1='some stuff about things\c'
% string2='some different stuff maybe'
% notvar="$string1" p
> 'some different stuff maybe'
% notvar="$string2" p
> 'some stuff about things'

Итак, вышесказанное не является супер-полезным как есть, но также учитывайте, что вы можете использовать аналогичные методы для тестирования переменных в этих документах, при необходимости присваивать переменные строки (в степени...), или даже как более короткое (и более быстрое!) средство для написания вашего первого заявления.

[ ! "${var##"string"}" ] && _MATCH || _NOMATCH

Или даже...

[ ${#var#*"${s=string}"} -lt ${#var} ] && _SUB_STRING_TEST=TRUE

Возможно даже...

% p() { printf '%s is %s of %s' "$2" "${var_chk-not}" "$1"
> }<<HEREDOC
> ${in="${1##*"${2}"*}"}
> ${in:-
>     ${in="${1##"${2}"}"}
>     ${in:-${var_chk=all}
>     ${var_chk=some}
> }
> HEREDOC
%

Ответ 5

вы можете использовать awk

awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'