не работает скрипт grep внутри оболочки

#bash #shell #grep

#bash #оболочка #grep

Вопрос:

Когда я запускаю это в командной строке, это работает:

 ls | grep -v "#$"
  

Но когда я делаю ls | scriptname и внутри скрипта у меня есть:

 #fileformat=unix
#!/bin/bash
grep -iv '#$'
  

Это не работает. Почему?

[ПРАВИТЬ]

причина появления первой строки объясняется здесь.

кроме того, даже если я удалю первые две строки, это ДОЛЖНО сработать. я попробовал то же самое на удаленной учетной записи Solaris, и это сработало. так это моя установка Fedora?

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

1. да, согласен, удаление первых 2 строк все равно должно сработать, потому что ваш скрипт интерпретируется оболочкой по умолчанию, почти наверняка bash. Но #fileformat=unix в вашем файле это, строго говоря, комментарий. Обратите внимание, что ссылка, которую вы включаете, ссылается на редактирование файла с помощью vi редактора И что точное использование : fileformat=unix (обратите внимание на символ ‘:’). Текст типа :var=value is vi означает «установить параметр vi», в данном случае fileformat=unix означает «использовать только символ n (LF) в конце строки, А НЕ версию r n для DOS (CR,LF)». Другие плакаты верны, вы не хотите, чтобы # f .. вверху!

Ответ №1:

Строка хэширования должна быть первой строкой в скрипте. Избавьтесь от #fileformat=unix . Также убедитесь, что ваш скрипт является исполняемым ( chmod x scriptname ). Это работает:

 #!/bin/bash
grep -iv '#$'
  

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

1. я не знаю, что произошло, но сейчас это работает … спасибо за вашу помощь

Ответ №2:

Измените его на ls < scriptname , чтобы выходные данные передавались в ls.

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

1. Я не голосовал против вас, но я думал об этом. 😉 … Вы должны протестировать свои решения перед публикацией. Продолжайте публиковать!

2. @shellter — Я протестировал его на своем Mac перед публикацией, и я получил тот же результат, что и при запуске ls | grep -v "#$" , может быть, я неправильно понял вопрос? Я действительно думаю, что ваше решение намного более гибкое, поскольку может передавать цели поиска

3. @shellter — Хорошо, я беру свои слова обратно 😉 Я только что посмотрел назад, где я тестировал, и я был полностью отключен, моя ошибка!

Ответ №3:

во-первых, вам нужен #! /bin/ bash в качестве первой строки в вашем скрипте.

Тогда ‘#$’ не имеет значения в пантеоне параметров оболочки. Вы ищете ‘#’ в конце строки? (Это нормально). Но если вы имели в виду ‘$#’, но тогда $# — это параметр, который означает ‘количество аргументов в командной строке’

Как правило, передача списка файлов в скрипт для выполнения действий должна выполняться с дополнительной оболочкой. Таким образом, простое, общее решение проблемы, которую вы ставите, может быть :

 $cat scriptname
#!/bin/bash

while read fileTargs ; do
   grep -iv "${@}" ${fileTargs}   # (search targets).
done
  

вызывается как

 ls | scriptname srchTargets
  

Я надеюсь, что это поможет.

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

1. «Вы ищете ‘#’ в конце строки? » Да