2010-04-30 2 views
3

Как я могу проверить, является ли какая-то строка точкой в ​​bash? Я попытался это:Тест на точку в bash

if [ "$var" = "." ] 

и это:

if [ "$var" = "\." ] 

Но это не работает.

+1

делает 'echo '$ {var}'' производят '.' без пробелов или дополнительных символов? Запустите свой скрипт как/bin/bash -x ./scriptname, чтобы узнать, что происходит на самом деле. –

+0

Можете ли вы опубликовать короткий, простой пример сценария и результаты, которые вы демонстрируете, что «это не работает», потому что он отлично подходит для меня. –

ответ

4

работает для меня:

$ d=. 
$ if [ $d = '.' ];then echo 'yes'; else echo 'no'; fi 
yes 
$ d=foo 
$ if [ $d = '.' ];then echo 'yes'; else echo 'no'; fi 
no 
0

Попробуйте удвоить равные (==), сравнение - это не то же самое, что и назначение.

+0

Спасибо. что o трюк – kofucii

+0

В Bourne/bash оператор = используется для обоих. – Ray

+0

-eq может использоваться только для целочисленного сравнения. = необходимо использовать для строк. – Ray

1

Мой код:

#!/bin/bash 

var="." 

[ $var = "." ] && echo "Yup, it equals '.'" 

exit 0 

который печатает:

Yup, it equals '.' 

отлажена:

[email protected]:~$ /bin/bash -x ./foo.sh 
+ var=. 
+ '[' . = . ']' 
+ echo 'Yup, it equals '\''.'\''' 
Yup, it equals '.' 
+ exit 0 

Возможно, у вас есть пробел в $var (или, может быть, $var пуст?), Запустите его через /bin/sh -x ./yourscript.sh, чтобы посмотреть, что его фактически сравнивает.

Имейте в виду, == является bashism, он работает только в Bash. Его там как комфорт для людей, которые привыкли к одному =, что приводит к назначению . Это нормально, если вы используете только bash, но вы никогда не знаете, что/bin/sh на некоторых системах может указывать. Лучше всего использовать = и вообще избежать проблемы.

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