URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8277
[ Назад ]

Исходное сообщение
"помогите написать небольшую программу под shell"

Отправлено garilla , 23-Май-09 16:52 
Совсем недавно начал изучать это дело, возникли некоторые затруднения. Мне нужно написать программу, которая печатает конец файла. По умолчанию – 10 последних строк (получается полный аналог команды tail). Конкретно затруднение вызвало передача параметра в строку: sed -e :a -e '$q;N;11,$D;ba' text.txt (печатает последние 10 строк из text.txt)
т.е. мне нужно вместо числа подставить параметр который я передаю, как это сделать?
И еще такая проблема: нужно как-то проверить передается ли параметр вообще. Т.е. если параметр передается, то я вывожу столько строк сколько передал, а если нет то 10. Как можно определить передается ли параметр в программу?

Содержание

Сообщения в этом обсуждении
"помогите написать небольшую программу под shell"
Отправлено angra , 23-Май-09 22:25 
Во-первых, студентам тут не подают
Во-вторых, если вам задают сделать аналог tail на bash, то обычно это означает на _чистом_ bash, без всяких внешних команд типа sed. Задача в общем-то элементарная и решается на чистом bash за пять минут после чтения описания команды read
В-третьих, почитайте man bash или abs(https://www.opennet.ru/docs/RUS/bash_scripting_guide/) на предмет использования кавычек.

"помогите написать небольшую программу под shell"
Отправлено garilla , 24-Май-09 14:11 
>Во-первых, студентам тут не подают

Я не прошу у вас никаких подачек.
А за ссылку на вменяемое руководство большое спасибо.



"помогите написать небольшую программу под shell"
Отправлено garilla , 24-Май-09 17:33 
Посмотрите кто-нибудь и оцените работоспособность, пожалуйста:

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


"помогите написать небольшую программу под shell"
Отправлено angra , 24-Май-09 21:10 
>Посмотрите кто-нибудь и оцените работоспособность, пожалуйста:

работоспособность вообще-то оценивается пробным запуском и вы это можете сделать сами.
>n='wc -l text.txt'      #подсчет кол-ва строк в

А почему сразу не sed или вообще tail? Какой смысл всего остального, после использования внешней команды? Если есть желание сделать в один проход и на чистом шелле, то стоит прочитать про массивы и циклы for


"помогите написать небольшую программу под shell"
Отправлено tux2002 , 29-Май-09 13:23 
#!/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 из файла
fi

while read line <&0
do
    for (( i=1; i < n; i++))
    do
        lines[$i]=${lines[$i+1]}
    done
    lines[n]=$line
    let "counter++"
done

nr=$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


В качестве черновика (мож с ошибками Сами тестируйте)