#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. «Вы ищете ‘#’ в конце строки? » Да