LINUX.ORG.RU

Недопонимание bash и статусов exit

 


0

1

Ни как не могу понять в чем причина ошибки.

    spaces="$(grep -n ' $' -- $file)"
    echo "end"

    if [ -n "$spaces" ] 
    then
        echo "error: $f has spaces in the end of line:"
        echo "$spaces"
        exit 1
    fi

В данном случае, до второй строки дело не доходит и скрипт завершает свою работу. echo $? пишет 1.

Да, в этом файле и нет строк оканчивающихся на пробел, но это не повод выходить с ошибкой. Я хотел в данном случае получить пустую строку.

ЧЯДНТ?



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

ЧЯДНТ?

может ты хотел вместо таких кавычек (( )) где можно математику счиитать, поставить [[ ]] где различные условия проверять ?

bl ★★★
()

Почему ты решил, что не доходит?

Вот выхлоп твоего скрипта на файле, в конце строк которого нет пробелов:

└─> bash -x test.sh file 
+ file=file
++ grep -n ' $' -- file
+ spaces=
+ echo end
end
+ (( -n  ))
Другое дело, что у тебя в условии ошибка, что наглядно видно, если натравить скрипт на файл, в конце строк которого пробелы есть:
└─> bash -x test.sh file 
+ file=file
++ grep -n ' $' -- file
+ spaces='1:asd '
+ echo end
end
+ (( -n 1:asd  ))
test.sh: line 11: ((: -n 1:asd : синтаксическая ошибка в выражение (error token is "1:asd ")

shell-script ★★★★★
()
Ответ на: комментарий от AoD314

не воспроизводится,
а ты пробовал отдельно запускать на боевых данных
grep -n ' $' — $file

может у тебя там фиксируется бинарные данные?

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

таки что хочет ТС? в моем примере ищется «пробел доллар» внутри строки
ему нужно найти строку с пробелом в конце?

Ager
()

Как вариант проблемы: файл $file с виндовозными концами строк.

sdio ★★★★★
()
Ответ на: комментарий от shell-script

Спасибо. Вроде заработало:

    spaces="$(grep -n ' $' -- $f)"
    if [ -n "$spaces" ]
    then 
        echo "error: $f has spaces in the end of line:"
        echo "$spaces"
        exit 1
    fi

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

echo «error: $f has spaces in the end of line:»

не косвенно, а явно указанно, ну так это ЛОР всегда найдутся ...

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

не понятно в чём разница? в круглых/квадратных скобках?

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

блин, так не работает. пришлось написать так:

    if [ -n "$(grep -n ' $' -- $f)" ]
    then 
        echo "error: $f has spaces in the end of line:"
        echo "$(grep -n ' $' -- $f)"
        exit 1
    fi

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

man grep:

-q, --quiet, --silent Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected. Also see the -s or --no-messages option. (-q is specified by POSIX.)

Не надо проверять, нашёл ли grep что-либо, строковыми операциями. Сравнение $? с нулём быстрее и надёжнее.

AITap ★★★★★
()

Не делай так

При большом $file выжрешь память.

grep -n ' $' "$file" \
| sed -e '1 i\
error: '"${file}"' has spaces in the end of line:\'
Нужно надеяться, что в имени файла не очень много кривых букв.

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

угу. Просто уточнил.

Кстати, я без -q делаю, удобно отлаживать.

emulek
()

Одинарные кавычки разве не экранируют метасимволы?

Кстати какую роль здесь выполняют тире "--"?

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

какую роль здесь выполняют тире "--"?

конец ключей, представь себе имя файла --file

anonymous
()
Ответ на: комментарий от emulek

ты специально ТС путаешь?

Посмотри альтернативы - либо загрузить «весь» файл в переменную (кто сказал, что там пара строчек) либо обрабатывать в 2 прохода.

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

grep ... | while read line ; do
 echo WARNING
 echo -- "$line"
 cat
 break
done
Но не факт, что часть отгрепленного не потеряется в буферах.

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

Одинарные кавычки разве не экранируют метасимволы?

в grep экранируют. Только надо помнить, что в RE и ERE набор метасимволов разный.

Кстати какую роль здесь выполняют тире "--"?

что-бы можно обрабатывать файлы с именем "---", которые большинство команд воспринимают как ключи.

emulek
()
Ответ на: ты специально ТС путаешь? от DonkeyHot

Посмотри альтернативы - либо загрузить «весь» файл в переменную (кто сказал, что там пара строчек) либо обрабатывать в 2 прохода.

а, ты ещё эту строку с пробелом добавил? Ладно, мой вариант:

sed -ne"/ $/{ierror: $file has spaces in the end of line:" -e"p}" "$file"

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

лучше даже так:

sed -ne"/ $/{ierror: $file has spaces in the end of line:" -e"p;q1}" "$file"

Этот вариант возвращает error code 1, если есть кривая строка.

emulek
()
Ответ на: комментарий от anonymous

Вот так легко и ненавязчиво программу на sh заменили программой на sed. :D

дык там изначально grep была. Я её на sed поменял, и добавил пару деталей. В этой задаче shell не нужен.

emulek
()

Похоже, что у тебя bash запускает скрипт с ключом -e(остановка после первого ненулевого кода возврата)

urquan
()
Ответ на: комментарий от teod0r

printf '%s\n' "$line", дурачок. А то, что ты написал, будет криво выводить строки со знаками процента.

anonymous
()
Ответ на: комментарий от teod0r

почему такая комбинация «лечит» %?

Потому что синтаксис printf — printf формат [аргументы], где «формат» — строка, в которой конструкции %что-то заменяются на аргументы (%s — вывести строку «как есть», %.5f — вывести дробное число до пятого знака после запятой, см. man 3 printf), по очереди, а \что-то — на спец. символы (\n — перевод строки, см. man 1 printf).

         ФОРМАТ             АРГУМЕНТ, соответствует "%s", будет выводиться как есть
         v                  v
$ printf 'Hello, %s!\n\n\n' 'world'
Hello, world!


$
anonymous
()
Ответ на: комментарий от anonymous

и не лень столько inline на него тратить

anonymous
()
Ответ на: комментарий от emulek

лучше даже так:

Это выводит только одну проблемную строку(оригинал - заголовок и все - что и было причиной не засовывать в память), и номера строки нет(AFAIK односедово не не решается).

Да, кстати, я не претнендовал на наилучшее решение.

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