Skip to content

Сценарии Bash

В этой статье поговорим о сценариях bash, на примерах вы поймете насколько они удобны и как ими пользоваться.

Прежде чем перейти к заданиям, которых у нас сегодня 12, нужно рассказать как запускать сценарии: итак, каждый сценарий мы будем помещать в файл с расширением .sh (это расширение сценариев в оболочке bash).

Вызывается этот файл в командной строке с помощью следующей конструкции: ./primer.sh , но прежде чем запускать этот файл, нужно установить права доступа на него: chmod a+rx primer.sh, и только после этого запускать файл в командной строке.

Программируем в командной строке

  1. Определите есть ли в текстовом файле слово root, выведите только ответ содержится или нет.
    Создаем файл pr1.sh в который помещаем следующий код:

    #!/bin/bash
    FILE=$1
    if grep -q root $FILE
    then
    echo "Содержится"
    else
    echo "Не содержится"
    fi
    

    Далее в командной строке меняем права доступа:

    chmod a+rx pr1.sh
    

    Затем вызываем этот скрипт с 1 параметром(имя файла):
    ./pr1.sh filename
    Для следующих файлов нужно проделать тоже самое(за исключением параметров, они у каждого сценария разные)

  2. Определите совпадают ли первые строки двух текстовых файлов и выведите соответствующее сообщение.
    #!/bin/bash
    FILE1=$1
    FILE2=$2
    str1=$(head -n 1 $FILE1)
    str2=$(head -n 1 $FILE2)
    if [ "$str1" = "$str2" ]
    then echo "Равно"
    else echo "Не Равно"
    fi
    

    Надеюсь, всем очевидно, что этот сценарий вызывается с 2 параметрами:
    ./pr2.sh filename1 filename2

  3. Вычислите и выведите первые 7 значений факториала.
    #!/bin/bash
    
    n=1
    for A in 1 2 3 4 5 6 7
    do
         : $((n=$n*$A))
    echo "$n "
    done
    
  4. Выведите 25 случайных чисел в форме квадрата 5Х5.
    #!/bin/bash
    n=1
    for A in 1 2 3 4 5
    do
        for B in 1 2 3 4 5
        do
            n=$RANDOM
            echo -n $n'   '
        done
        echo ' '
    done
    

    Текстовые файлы

  5. Используя цикл, создайте 10 файлов (rating1…rating10) для студентов в формате: <фамилия> <оценка 1> <оценка 2> … <оценка 100>.
    #!/bin/bash
    i=0
    j=0
    until [ "$i" = 10 ]
    do
        j=0
        echo -n ФИО' -> ' >> rating$(echo $i).txt
        while [ $j -lt 100 ]
        do
        #echo "$i"
        #echo "$j"
        echo -n оценка$j'   ' >> rating$(echo $i).txt
        let "j+=1"
        done
    let "i+=1"
    done
    
  6. Создайте один итоговый файл в формате один студент – одна строка. <фамилия> <оценка1> <оценка 2> … <оценка 100>
    #!/bin/bash
    paste -s rating{0..9}.txt > itog.txt
    
  7. Есть 10 файлов. В каждом файле есть строки с заголовком и соответствующими данными под ними. Заголовки во всех файлах одинаковые, данные – разные.
    Заголовок 1
    Данные 1.1
    Заголовок 2
    Данные 1.2
    ……
    Например:file1.txt
    >hg19
    aaaaaaaa
    >mm9
    bbbbbbb
    file2.txt
    >hg19
    cccccccc
    >mm9
    dddddddНадо создать результирующий файл chr.fasta, в котором под заголовками будут строки с данными, последовательно склеенными из всех 10 файлов.
    Заголовок 1
    Данные 1.1 Данные 2.1 Данные 3.1 …
    Заголовок 2
    Данные 1.2 Данные 2.2 Данные 3.2 … …… Файлы прилагаются в архиве.

    #!/bin/bash
    #cd files4lab4
    paste -d"\n" chr{1..10}.fasta > chr.fasta
    uniq itog.txt
    

    Сценарии bash

  8. Измените скрипт (Пример case, лекция 10) так чтобы продолжал ожидать ввод клавиш, выводя результаты каждого нажатия, пока не нажата клавиша “X”.
    #!/bin/bash
    # Проверка диапазонов символов
    echo; echo "Нажмите клавишу и затем нажмите Return (Enter)."
    read Keypress
    while [ $Keypress != 'X' ]
    do
    case "$Keypress" in
    [[:lower:]] ) echo "Буква в нижнем регистре";;
    [[:upper:]] ) echo "Буква в верхнем регистре";;
    [0-9] ) echo "Цифра";;
    * ) echo "Знак пунктуации, пробел или что-то другое";;
    esac
    read Keypress
    done
    
  9. Напишите сценарий, проверяющий имя текущего каталога и выводящий сообщение об ошибке, если оно короче пяти символов.
    #!/bin/bash
    n=$(pwd)
    l=${#n}
    echo $n
    echo $l
    if [ "$l" -lt 5 ]
    then
    echo "Ошибка"
    else
    echo "Всё ок посоны"
    fi
    
  10. Требуется проверить, является ли файл обычным или он является каталогом. Если это обычный файл, то сценарий должен выводить имя файла и его размер. В случае, если размер файла превышает килобайт, то размер должен выводиться в килобайтах. Если размер превышает мегабайт — в мегабайтах. Ознакомьтесь с командой du.
    #!/bin/bash
    file=$1
    declare -i siz
    if $(test -f $file)
    then
    siz=$(du -b $file | cut -f1)
    
    
    
    if  (( "$siz" > 1024 && "$siz" < 1024*1024 ))
    then
    echo $(du -k $file)
    fi
    
    if (( "$siz" < 1024 ))
    then
    echo $siz
    fi
    
    if (( siz > 1024*1024 ))
    then
    echo $(du -m $file)
    fi
    
    fi
    
  11. Напишите сценарий, выводящий посекундно в цикле имена файлов текущего каталога и их порядковый номер.
    #!/bin/bash
    c=0
    for file in `find * -maxdepth 0 -type f`
    do echo "$c - $file"
    c=$[$c+1]
    sleep 1
    done
    
  12. Напишите сценарий, который генерирует тысячу файлов 1.txt …. 1000.txt, и в каждый файл записывает подряд 100 чисел N, где N = порядковый номер файла. Затем скрипт должен соединить в один файл все файлы с четными номерами (even.txt) и в другой файл – все файлы с нечетными номерами (odd.txt).
    !/bin/bash
    i=0
    j=0
    until [ "$i" = 1000 ]
    do
        j=0
        while [ $j -lt 100 ]
        do
        #echo "$i"
        #echo "$j"
        echo $i >> file-$(echo $i).txt
        let "j+=1"
        done
    let "i+=1"
    done
    paste -s file*{0,2,4,6,8}.txt > even.txt
    paste -s file*{1,3,5,7,9}.txt > odd.txt
    

Просмотреть исходники
Файлы к 7 заданию
Не забывайте оставлять свои комментарии!

Опубликовано вLinux Bash

Комментарии

  1. Александр Александр

    более менее рабочий вариант 3 задания
    #!/bin/bash

    n=1
    for A in {1..7};
    do
    $((n=$n*$A))
    echo «$n »
    done

  2. Nikiqq Nikiqq

    Да, Александр, спасибо. Действительно с квадратными скобками не работало, изменили на более простой вид.

  3. Nikiqq Nikiqq

    ну и проверили, конечно же)

  4. Андрей Андрей

    В первом задании ошибка. Там с &FILE что-то не так

  5. Nikiqq Nikiqq

    Андрей, в данном задании, FILE это переменная, которой присваивается значение первого параметра при вызове сценария, и там не & , там $. Сценарий будет вызываться таким образом: ./pr1.sh filename, где filename — имя любого файла на вашем компьютере)

Добавить комментарий