LINUX.ORG.RU

Много аргументов в if из-за *

 , ,


0

2

Пишу скрипт

if [ "$1" == *".txt" ]
then
	printf "asd"
fi

Выходит это:

./oo: строка 14: [: слишком много аргументов

Но если я меняю if [ "$1" == *".txt" ] на if [ "$1" == "*.txt" ], то все работает, но желаемого результата нет

Изменено:

Всем спасибо, помогло добавление второй пары квадратных скобок, т.е. if [[ "$1" == *".txt" ]]



Последнее исправление: madreyk (всего исправлений: 1)

Так а чего вы пытаетесь добиться? Если там больше одного файла то будет фейл, да.

PPP328 ★★★★★
()
Ответ на: Когда вопрос задан *почти* правильно от anonymous

А желаемый результат-то какой?

А разве не очевидно? Нужно узнать, равняется-ли файл файл чему-то, оканчивающееся на .txt, что-то это и есть*

Может, Вам expr с его поддержкой регулярных выражений нужен, или $(basename), или ещё что?

Вопрос именно по SH скрипту, не думаю, что стоит использовать что-то стороннее, когда есть встроенное IF

madreyk
() автор топика
Ответ на: комментарий от madreyk

равняется-ли файл файл чему-то, оканчивающееся на .txt, что-то это и есть*

Вы делаете это неправильно. * развернется в список файлов в текущей директории.

if [[ "$name" == *.txt ]]; ....
PPP328 ★★★★★
()

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

В конструкции [ "$1" == *".txt" ] *".txt" развернётся в список файлов *.txt в текущем каталоге, т.е. во что-то типа [ "$1" == a.txt b.txt c.txt ], что есть бред.

В конструкции [ "$1" == "*.txt" ] $1 сравнится со строкой *.txt.

Если ты желаешь проверить $1 на соответствие маске то можно сделать, например так:

if echo "$1" | grep -q '.\.txt$'; then

Если ты желаешь проверить есть ли имя файла $1 в текущем каталоге то так:

if [ -e "$1" ]; then

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)

Ахаха, башщхъ. Наслаждайся. Я каждый раз гуглю, когда нужно в скрипте сделать if. Это ж надо было настолько криво слепить язык. Специально захочешь - не сможешь.

ox55ff ★★★★★
()
Ответ на: комментарий от madreyk

Нужно узнать, равняется-ли файл файл чему-то, оканчивающееся на .txt

Прочитай тогда про разницу между регэкспами и глоббингом. То, что тебе надо, делается так

if [[ "$1" =~ txt$ ]] ; then

gremlin_the_red ★★★★★
()

Я ничего не понял и не эксперт в bash, но…

case $1 in
  *.txt) printf asdf ;;
esac
anonymous
()
Ответ на: комментарий от madreyk

Это башизм. Лучше сделать как анонимус написал.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.