Совсем недавно начал изучать это дело, возникли некоторые затруднения. Мне нужно написать программу, которая печатает конец файла. По умолчанию – 10 последних строк (получается полный аналог команды tail). Конкретно затруднение вызвало передача параметра в строку: sed -e :a -e '$q;N;11,$D;ba' text.txt (печатает последние 10 строк из text.txt)
т.е. мне нужно вместо числа подставить параметр который я передаю, как это сделать?
И еще такая проблема: нужно как-то проверить передается ли параметр вообще. Т.е. если параметр передается, то я вывожу столько строк сколько передал, а если нет то 10. Как можно определить передается ли параметр в программу?
Во-первых, студентам тут не подают
Во-вторых, если вам задают сделать аналог tail на bash, то обычно это означает на _чистом_ bash, без всяких внешних команд типа sed. Задача в общем-то элементарная и решается на чистом bash за пять минут после чтения описания команды read
В-третьих, почитайте man bash или abs(https://www.opennet.ru/docs/RUS/bash_scripting_guide/) на предмет использования кавычек.
>Во-первых, студентам тут не подаютЯ не прошу у вас никаких подачек.
А за ссылку на вменяемое руководство большое спасибо.
Посмотрите кто-нибудь и оцените работоспособность, пожалуйста:n='wc -l text.txt' #подсчет кол-ва строк в файле text.txt
temp=0
lines=0
if [-n "$1"] #проверка наличия параметра
then lines=$1
else lines=10
fi
let "$n-=$lines" #в n записывается номер строки с которой нужно выводить текст
while read line
do
let "$temp+=1" #номер текущей строки
if [$n -le $temp] #если номер тукщей строки больше n
then echo "$line" #то эта строка выводиться на экран
done
>Посмотрите кто-нибудь и оцените работоспособность, пожалуйста:работоспособность вообще-то оценивается пробным запуском и вы это можете сделать сами.
>n='wc -l text.txt' #подсчет кол-ва строк вА почему сразу не sed или вообще tail? Какой смысл всего остального, после использования внешней команды? Если есть желание сделать в один проход и на чистом шелле, то стоит прочитать про массивы и циклы for
#!/bin/sh#################аргументы##########################
n=5 # Количество строк
myfile="/var/log/messages" #При режиме file
#tailmode="stdin"
tailmode="file"
####################################################counter=0
if [ $tailmode = "file" ]
then
exec 0>&- # Закрываем stdin
exec 0<$myfile # Открываем stdin из файла
fiwhile read line <&0
do
for (( i=1; i < n; i++))
do
lines[$i]=${lines[$i+1]}
done
lines[n]=$line
let "counter++"
donenr=$n
if [ $counter -lt $n ]
then
nr=$counter # Если строк меньше n
fi
for (( i=n-nr+1; i <= n ; i++))
do
echo ${lines[$i]}
done# В этом режиме в бесконечный цикл ожидания следующей строки
if [ $tailmode = "file" ]
then
while [ true ]
do
while read line <&0
do
echo $line
done
done
fi
В качестве черновика (мож с ошибками Сами тестируйте)