2013-12-04 2 views
4

Почему следующий код не работает в bash? Заметьте, я пытаюсь выполнить более сложное сравнение, такое как «somestring \ r»; это просто упрощенный пример.Выполнение сравнения строк с возвратом каретки в bash

Я могу подтвердить, что возврат каретки «ascii 13» входит в сценарий. Но я не могу сравнивать его с регулярным сопоставлением строк.

Ожидаемый результат: «1» для положительного совпадения.

Командная строка:

echo -e "\r" | ./test.sh 

Сценарий:

ord() { 
    printf '%d' "'$1" 
} 

read a 
echo "1st char: $(ord ${a:0:1})" 

left="${a:0:1}" 

if [ "$left" = "\r" ]; then 
    echo 1 
fi 

exit 0 

ответ

4

Ниже будет показано, как можно определить, если строка содержит возврат каретки:

read a 
if [[ $a =~ $'\r' ]]; then 
    echo 1; 
fi 

Отработка это, говоря :

echo -e "something\r" | bash foo 

вернется

1 

EDIT: Если вы хотите, чтобы выяснить, содержит ли последний символ строки возврата каретки, вы можете сказать:

if [[ ${a: -1} = $'\r' ]]; then 
    echo 1; 
fi 
+0

хорошая попытка, но то, что я хочу, - это сравнение точных совпадений с подстрокой. – Zhro

+1

Просто замените '= ~' '' ''. Синтаксис '$ '...'' не является особым для соответствия регулярному выражению; это всего лишь способ построения строки, в которой некоторые экранированные символы имеют особое значение. – chepner

+0

@Zhro chepner уже упоминается в комментарии. Однако см. Приведенное выше изменение. – devnull

Смежные вопросы