Он предназначен для обработки недопустимых опций. В примере, если вы запустите script -a
, ожидается опция -a
и результат «-a
был запущен!». Если вы запустите script -b
, -b
недопустимо и будет обработано случаем \?
, что приведет к «Недопустимой опции :-b
».
Проблема с вашим решением заключается в том, что вы вызываете grep
для каждой строки. На самом деле, grep также анализирует каждую строку. Таким образом, для файла с n строками эти строки анализируются n^2 раз, а загрузка grep
— довольно затратный вызов.
Используйте однострочный буфер -, в этом примере называемый PrevLine
, например:
#!/bin/bash
CurLine=''
isFirstLine=true
while IFS='' read -r LineBelow; do
if $isFirstLine; then
echo "This is the first line, so no previous."
else
echo "Current line read: ${CurLine}"
echo "Line below: ${LineBelow}"
fi
CurLine="${LineBelow}"
isFirstLine=false
done <"$1"
На самом деле присвоение true
к isFirstLine
— это присваивание строки, а простое упоминание$isFirstLine
(в условии if -)— это выполнение команды этой строки. Поскольку true
и false
являются встроенными в bash -, их можно использовать напрямую без существенного влияния на скорость, но с большим увеличением читабельности.
В последней строке упоминается $1
как имя входного файла, поэтому вызовите с помощью:
./test.sh inputfile.txt