Сравнение строк не работает в сценарии оболочки

#string #shell #unix

#строка #оболочка #unix

Вопрос:

Я написал простой сценарий оболочки для выполнения некоторой работы по автоматизации. В основном скрипт выполняет поиск всех файлов по текущему пути, и если файл указан, он выполняет некоторое действие. Ниже приведены соответствующие строки —

 #!/bin/bash
for i in `ls *`
do
if [$i =="ls.sh"] 
then .... //do something
fi
done
  

Однако сравнение строк в строке 3 не работает, и я получаю это при запуске скрипта —

 ./ls.sh: line 3: [scripth.sh: command not found
./ls.sh: line 3: [scripth.sh~: command not found
./ls.sh: line 3: [test.sh: command not found
  

Какое исправление необходимо выполнить?

Комментарии:

1. Поскольку вы хотите что-то сделать, если ls.sh существует, почему бы просто не написать: if [ -f ls.sh ] ; then ...do something...; fi ?

Ответ №1:

прежде всего, не используйте ls подобным образом. Если в ваших файлах будут пробелы, это сойдет с ума!. Используйте расширение командной строки. Затем вы можете использовать case/esac для сравнения строк. (или if / else)

 for file in *
do
  case "$file" in
    "ls.sh" ) echo "do something"
     ;;
  esac
done
  

Ответ №2:

Существует несколько проблем.

В строке 1 вы делаете не то, что думаете. Вы должны поместить обратную кавычку вокруг ls *:

 for i in `ls *`
  

Это приведет ко всем файлам, которые перечислены в текущем каталоге. Ваша строка не будет запускать никаких команд, но вместо этого она будет использовать * для получения всех файлов, и ваш список будет содержать слово «ls» в начале.

попробуйте это из командной строки:

 echo ls *
echo `ls *`
  

Возможно, вы просто захотите сделать:

 for i in *
  

Вторая проблема. Поместите пробелы внутри квадратных скобок:

 [ $i == "ls.sh" ]
  

Пробелы необходимы.

Третья проблема. Используйте один = для сравнения строк

 [ $i = "ls.sh" ]
  

Комментарии:

1. 1: Хороший ответ. Учитывая форматирование, которое вы видели, ваш диагноз о необходимых обратных ссылках был правильным. Как только вопрос был отформатирован, ваш комментарий там стал неточным. Это не ваша вина — я отмечаю это, чтобы инициаторы не проголосовали против вас.

2. Спасибо за комментарий. У меня была такая же проблема с вводом обратных ссылок, но я не думал о том, что их нет в вопросе по той же причине.

Ответ №3:

Используйте: if [ "$i" = "ls.sh" ] — обратите внимание на пробелы.

Ответ №4:

Если вы хотите только проверить существование файла, вы могли бы сделать это непосредственно в командной строке.

 if [ -e ls.sh ]
then 
  # ... do something
fi
  

Ответ №5:

Вы не указали пробел после == , поэтому ваш код на самом деле должен быть:

 #!/bin/bash
for i in `ls *`
do
    if [ $i == "ls.sh" ] 
    then 
        //do something
    fi
done
  

Комментарии:

1. Вам также понадобятся пробелы, чтобы отделять [ имя команды от ее аргументов.