2015-11-29 3 views
2

я должен прочитать файл, заданный мне в сценарии я сделал, файл может быть любым именем, вход следующегоЧтение текстового файла в Баше построчно, не зная его имени

. /Naloga1.sh tocke < somefile.txt

Это код, у меня есть:

while read line 
do 
    echo $line 
done < 

проблема заключается в том, во-первых, если я поставил имя сценария на сделано, он будет читать все строки в моем файле - последний. И во-вторых, как я могу получить имя файла, чтобы потом вывести его? Если я эхо $ 1 $ 2 $ 3, $ 1 приходит как tocke и $ 2 и $ 3 не существуют

+1

Удалить '<' после 'done' для чтения из stdin. – Cyrus

ответ

2

< не является аргументом в сценарий, bash интерпретирует, что до вашего скрипта вызывается. Он переадресовывает stdin для сценария, исходящего из, в данном случае, somefile.txt.

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

Если вы хотите взять имя файла в качестве аргумента, просто удалите < из вашего вызова, а затем строка somefile.txt будет храниться в $2, которые вы можете использовать для перенаправления ввода для цикла в то время как, если вы хотите или любую другую цель, которую вы могли бы иметь.

+0

Спасибо, вы, может быть, знаете, как я буду игнорировать строки, начинающиеся с «#». – LukaTheLegend

+0

Внутри цикла вы можете сделать что-то вроде 'if [[" $ line "= ~^#]]; затем продолжить; fi', чтобы увидеть, начинается ли оно с '#' и продолжит цикл, если он –

+0

. Регулярные выражения могут решить эту проблему или просто добавить в if, если проверка первого символа, который вы прочитали. Echo в переменную tmp, проверьте первый символ, если нет # вставьте его. –

Смежные вопросы