#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. Вам также понадобятся пробелы, чтобы отделять
[
имя команды от ее аргументов.