Убунту как написать скрипт для

Contents

  1. Intro
  2. Bash — Everyday Ubuntu life
  3. Commands

    1. Creating folders
    2. Deleting files
    3. Deleting folders and their sub-folders
    4. Running commands as root
    5. Opening GUI applications as root
    6. Backing up your files
    7. Backing up your Directories
    8. Checking system performance
    9. Check Devices
    10. Show network Information
    11. Show wireless information
  4. Scripting

    1. Variables
    2. If Statements
  5. Storing application stdout to a variable:

    1. Example
    2. Example 2
  6. FUNctions

    1. Example

      1. Debugging
  7. Other Scripting Languages related to Bash

    1. tr

      1. Example
      2. Example
    2. AWK

      1. pidof clone
    3. SED

      1. Basic Substitution

Bash scripting is one of the easiest types of scripting to learn, and is best compared to Windows Batch scripting. Bash is very flexible, and has many advanced features that you won’t see in batch scripts.

However if you are a ‘non-computer-savvy’ person that won’t mean a thing to you. Bash is the language that you will learn to love as much of everyday Ubuntu life is done/can be done using the Terminal. You will soon learn that most things can be done through both GUI (Graphical User Interface) and CLI (Command Line Interface), however some things are more easily achieved from one or the other. For example, changing file permissions of a folder and all its sub folders is more easily achieved using cli instead gui.

NOTE: Text that is inside the box are to be entered into a terminal as follows:

If it's inside a box like this... enter it into a terminal unless instructed to do otherwise. Except this box. Of course. Silly.

You can also just copy and paste if needed.

Intro

In this document we will discuss useful everyday commands, as well as going a bit more in depth into scripting and semi-advanced features of Bash. Bash is not only used to run programs and applications, but it can also be used to write programs or scripts.

Bash — Everyday Ubuntu life

During your time as an Ubuntu user you will use the terminal to perform tasks such as

  • Creating folders
  • Deleting files
  • Deleting folders and their sub-folders
  • Opening applications as root
  • Backing up your files
  • Backing up your folders
  • Checking system performance
  • Check Devices
  • Checking wireless connection

Along with many other things, the list above will be the commands we will discuss.

Commands

Creating folders

Creating folders can be done simply in the file manager nautilus by right clicking and selecting ‘Create Folder’, but if you want to do this from a cli environment you would type the following in the terminal:

mkdir /home/joe/Desktop/new_folder

the mkdir (make directory) command creates the folder then the file path tells it where to create the folder.

Deleting files

Deleting files are done with the rm command as follows:

rm /home/joe/file_to_be_deleted

the rm (remove) command is used to remove anything through a cli environment.

Deleting folders and their sub-folders

The command you are about to read can potentially (if used incorrectly) destroy your system!

rm -r /home/joe/useless_Parent_folder

To force (note most of the time you will not need to use -f)

rm -rf /home/joe/useless_Parent_folder

This command is slightly different to the one before, it uses two options ‘-r’ which means recursive (will delete the folder and all sub-folders) and ‘-f’ means force (will not ask for your permission). This command is perfectly fine for deleting a dir and all its sub-dirs. The next commands should !!**!!NEVER!!**!! be run. Unless you want to say goodbye to your system.

rm -rf /*
rm -rf /

This will delete everything from your root folder downwards, which if you did a standard install would be everything.

Running commands as root

When working on the command line, you usually want to work with the default permissions. This way you insure that you won’t accidentally break anything belonging to the system or other users, so long as the system and other users haven’t altered their file permissions. Yet there will be times when you wish to copy a file to a system folder (like /usr/local/bin) to make it available to all users of the system. Only the system administrator (i.e. the user ‘root’) should have permission to alter the contents of system directories like /usr/local/bin. Therefore trying to copy a file (like a program downloaded from the Internet) into that folder is forbidden by default.

cp Downloads/some_downloaded_program /usr/local/bin
cp: cannot create regular file `/usr/local/bin/some_downloaded_program': Permission denied

Since it would be very tedious to always login as root to do administrative work (in fact you should avoid logging in as root with a graphical desktop) you can use the sudo program to execute a single command as root.

sudo cp Downloads/some_downloaded_program /usr/local/bin

The default Ubuntu installation is configured so that the user who was created during system installation is allowed to use this command. It will prompt for the password and execute the command as the root user.

Opening GUI applications as root

Sometimes you will want to edit a config file in your root folder, in order to save changes to this file you need root privileges so we need to open our text editor as root. All you will need is just sudo or pkexec to show a gui password popup.

sudo gedit

Note a lot of kde apps will not work like kate or dolphin.

Backing up your files

To create a backup of a file, we’re going to use the cp (copy) command. The basic syntax for cp is as follows:

cp source_file dest_file

This will copy the ‘source_file’ to the ‘dest_file’. Now, using the previous example, we want to backup ‘/path/to/conf_file.txt’. To accomplish this, we type the following:

sudo cp /path/to/conf_file.txt /path/to/conf_file.txt.old

That’s fine and dandy, but what if I want to copy my file to another directory? Well that’s just as easy. Let’s say instead of copying /path/to/conf_file.txt to the /path/to/ directory, you want to copy it to a directory where you store all of your backup files, say /my/backup/folder/. In order to accomplish this you would type:

cp /path/to/conf_file.txt /my/backup/folder/    #saves conf_file.txt to /my/backup/folder/
#OR
cp /path/to/conf_file.txt /my/backup/folder/conf_file_new_name.txt

***This is a typical safety measure that has saved many users in the past from a complete disaster.***

Okay, so we know how to copy a file: a) to a different filename and b) to a different folder. But how do we copy entire directories?

Backing up your Directories

To backup one directory to another, we introduce cp -r (recursive) option. The basic syntax is as follow:

cp -r /directory/to/be/copied/ /where/to/copy/to/

So if we wanted to copy all of the contents of our /path/to/ folder to our /my/backup/folder, we would type the following:

cp -r /path/to/ /my/backup/folder/foldername    #foldername can be whatever you want the foldername to be

Checking system performance

If your computer starts to lag, you can see which applications are using the most CPU power with this command:

top

This is generally the same information given as the GUI application ‘System Monitor’.

Check Devices

USB Devices:

If a USB device stops working, you may want to see if it is still connected/detected. To check if a device is connected/detected, type the following:

lsusb

PCI Devices:

As PCI devices are checked with:

lspci

Show network Information

To see the status of your network connection, use the command:

ip addr

This command will show you your ip, what type of connection you are using, etc.

Show wireless information

Like the command ip stated above, you can use iwconfig to check the settings of your wireless connection without editing anything. In a terminal enter:

iwconfig

This also shows packets sent/received.

Scripting

NOTE: The commands given in the scripting section are to be put into the text editor and not in the terminal unless instructed otherwise.

Bash is primarily a scripting language, so it would be a crime not to talk about scripting. Let’s dive straight in with a bash script. More precisely the infamous «Hello World» script. You can create a bash script by opening your favorite text editor to edit your script and then saving it (typically the .sh file extension is used for your reference, but is not necessary. In our examples, we will be using the .sh extension but instead Linux uses #!/path/to/runtime or in this case #!/bin/bash).

 #!/bin/bash         

echo "Hello, World"

The first line of the script just defines which interpreter to use. NOTE: There is no leading whitespace before #!/bin/bash. That’s it, simple as that. To run a bash script you first have to have the correct file permissions. We do this with chmod command in terminal (change mode) as follows:

chmod a+x /where/i/saved/it/hello_world.sh   #Gives everyone execute permissions
# OR
chmod 700 /where/i/saved/it/hello_world.sh   #Gives read,write,execute permissions to the Owner

This will give the file the appropriate permissions so that it can be executed. Now open a terminal and run the script like this:

/where/i/saved/it/hello_world.sh

Hopefully you should have seen it print Hello, World onto your screen. If so well done! That is your first Bash script.

TIP If you type:

pwd

You will see the directory that you are currently working in (pwd stands for ‘print working directory’). If your current working directory is /where/i/saved/it/, then you can shorten the above command to:

prompt$ pwd
/where/i/saved/it
prompt$ ./hello_world.sh

Now, lets get to more interesting aspects of Bash programming, Variables!

Variables

Variables basically store information. You set variables like this using text editor:

var="FOO"

‘var’ can be anything you want as long as it doesn’t begin with a number. «FOO» can be anything you want.

To access the information from the variable you need to put a ‘$’ in front of it like this:

var="FOO"
echo $var

Try entering those lines into a terminal one at a time; you will see that the first one just gives you another prompt and the second one prints FOO.

But that’s all a bit boring. So let’s make a script to ask the user for some information and then echo that information.

 #!/bin/bash
clear
echo "Please enter your name"
read name
echo "Please enter your age"
read age
echo "Please enter your sex. Male/Female"
read sex
echo "So you're a $age year old $sex called $name"

read allows the user to input information where it is then stored in the variable defined after the read. read variable would take whatever input the user entered and store it in $variable. We then access this with echo and set up a neat sentence. This script is reasonably messy though; read has another function that could halve the size of this script.

clear
read -p "Please enter your name  : " name
read -p "Please enter your age  : " age
read -p "Please enter your sex. Male/Female  : " sex
echo "So you're a $age year old $sex called $name"

That is more efficient code. However it’s still a bit messy when run. A solution? Good old white spaces!

clear
read -p "Please enter your name  : " name
echo ""
read -p "Please enter your age  : " age
echo ""
read -p "Please enter your sex. Male/Female  : " sex
echo ""
echo "So you're a $age year old $sex called $name"

Now we have an efficient and clean Bash script.

If Statements

An if statement can be used to check for something and do something else depending on the outcome of the check. For example, if I had an ‘apple’, I would want to make sure it’s still an ‘apple’ and not an ‘orange’ because I don’t like Oranges!

The syntax for an if statement is

if [something]
        then
        elif
        then
        elif
        then
        ....etc....
        else
fi

The else if statement or (elif) is not necessary, but it can be used if needed.

An if statement to check if our $fruit variable is an ‘apple’ would look like this

echo "Please enter type of fruit"
read fruit

if [ $fruit = apple ]
        then echo "Good, I like Apples"
        else echo "Oh no, I hate Oranges!"
fi

Just to explain this statement,

if [ the contents of $fruit is 'apple' ]
        then say "Good, I like Apples"
        if it's not, then say "Oh no, I hate Oranges!"
finish

If statements are an easy concept to grasp as they are similar to the «if» used in spoken English. But say you wanted to have 4 or 5 checks, the answer may be to write 4 or 5 statements but that’s not the most practical way. This is where elif comes in handy.

if [ $fruit = apple ]
        then echo "Good, I like Apples"
elif [ $fruit = pear ]
        then echo "Good, I like Pears"
elif [ $fruit = banana ]
        then echo "Good, I like Bananas"
        else echo "Oh no, I hate Oranges!"
fi

This saves us from from repetitive scripting. There are better ways to check what the fruit is, but we won’t go into that now.

Storing application stdout to a variable:

Application stdout ( what you see on the terminal screen, with an un-piped application ) can be saved and used in Bash. The simplest and most elegant way is to use command substitution, by wrapping the code in $(…)

Example

fooVar=$(who)
echo $fooVar

This code should output the current users, their respective ttys, and date of login. Note that this strips newlines. Be sure to do any parsing in line ( | grep, etc ) and then pass it to a variable. We will try this again, but grep for tty7, the GUI’s tty.

Example 2

fooVar=$(who | grep tty7)
echo $fooVar

This should output the single user that is currently logged into the WM. Let’s move on to more advanced data manipulation within command substitution.

FUNctions

Bash lets you create a function on the fly, really handy if you plan on using a code block more then once. Functions reduce the amounts of editing you have to do in a script, if and when you have to update your script. Let’s get to it!

Example

Here is an example script:

echo "echo is Called"
echo "Functions are FUN!"
echo "echo is Called"

Although this example is simple, you can see that if you want to change «echo is Called» to say «foo is Called» you would have to edit twice.

Below is the same app using functions.

echoFunction() {
  echo "echo is Called"
}
fooBar() {
  echo "Functions are FUN!"
}

echoFunction;
fooBar;
echoFunction;
# You call functions without (), just the function name then a semicolon.

This example, as you can see may be longer now, but you can imagine how, adding features, this will eliminate code and reduce complexity. Also, you can see if you want to change the echo call, you have to edit one line, not two.

Debugging

I always find it useful to trace a script to find out why something does not work as expected. To trace, start it through bash explicitly and use the -x option, like so:

bash -x ./script.sh

This will write each command to standard error (preceded by a ‘+ ’) before it is executed.

tr

tr is one of the most basic applications to pipe data through that uses a basic scripting syntax. In this case, it accepts Regular Expressions. Let’s do a normally complicated task, transforming a string to all uppercase.

Example

read foo
var=$(echo $foo | tr "{a-z}" "{A-Z}")
 # {a-z} Matches a through z
 # {A-Z} matches A through Z
echo $var

The output should look something like this:

this is a test
THIS IS A TEST

tr also can TRanslate strings, so let’s translate all «tar» in $foo to «bar».

Example

echo "Type in: I love tars"
read foo
var=$(echo $foo | tr "t" "b")
echo $var

the output should look something like this:

I love tars
I love bars

AWK

AWK ( Short for Aho, Weinberger & Kernighan )

awk has its own custom scripting language, suitable for a tutorial by itself, so I will cover only the basics to help assist when you are bash scripting. This is not meant to be complete or comprehensive in any way.

pidof clone

Let’s make a quick pidof clone that prompts for a process identifier, then echoes the process ID.

read pname
ps -ef | grep -v grep | grep $pname | awk '{print $2}'

Let’s take some pipes out and use only awk for the filtering

read pname
ps -ef | awk -v p=${pname} '$8 ~ p { print $2 }'

Single quotes are used to pass the awk command(s). The curly braces are to use the awk language (for stuff like prints, ifs, etc.). Print prints the column passed given by the $ markup, space delimited.

The awk -v option allow passing a shell value into an awk variable, the $8 is a field variable (column 8 of the ps -ef command’s output) and the operator ~ is a regular expression match.

There are a lot more commands than the print command, including if statements, etc., and is worth looking into if you are interested in what you see here!

SED

sed is one of the most complicated scripting languages on the GNU / Linux system. I am only going to cover the s/ command here.

Basic Substitution

Try this out to show that sed can not only replace inline, but unlike tr, replace with a longer or shorter string than before.

read foo
echo $foo | sed "s/foo/bars/"

When this command is run, it should substitute the first appearance of «foo» with «bars».

This is an example of the output.

I love to go to foo
I love to go to bars

CategoryCommandLine

Каким бы простым ни был графический интерфейс в Linux и сколько бы там ни было функций, все равно есть задачи, которые удобнее решать через терминал. Во-первых, потому что это быстрее, во-вторых — не на всех машинах есть графический интерфейс, например, на серверах все действия выполняются через терминал, в целях экономии вычислительных ресурсов.

Если вы уже более опытный пользователь, то, наверное, часто выполняете различные задачи через терминал. Часто встречаются задачи, для которых нужно выполнять несколько команд по очереди, например, для обновления системы необходимо сначала выполнить обновление репозиториев, а уже затем скачать новые версии пакетов. Это только пример и таких действий очень много, даже взять резервное копирование и загрузку скопированных файлов на удаленный сервер. Поэтому, чтобы не набирать одни и те же команды несколько раз можно использовать скрипты. В этой статье мы рассмотрим написание скриптов на Bash, рассмотрим основные операторы, а также то как они работают, так сказать, bash скрипты с нуля.

Основы скриптов

Скрипт или как его еще называют — сценарий, это последовательность команд, которые по очереди считывает и выполняет программа-интерпретатор, в нашем случае это программа командной строки — bash.

Скрипт — это обычный текстовый файл, в котором перечислены обычные команды, которые мы привыкли вводить вручную, а также указанна программа, которая будет их выполнять. Загрузчик, который будет выполнять скрипт не умеет работать с переменными окружения, поэтому ему нужно передать точный путь к программе, которую нужно запустить. А дальше он уже передаст ваш скрипт этой программе и начнется выполнение.

Простейший пример скрипта для командной оболочки Bash:

#!/bin/bash
echo "Hello world"

bash1

Утилита echo выводит строку, переданную ей в параметре на экран. Первая строка особая, она задает программу, которая будет выполнять команды. Вообще говоря, мы можем создать скрипт на любом другом языке программирования и указать нужный интерпретатор, например, на python:

#!/usr/bin/env python
print("Hello world")

Или на PHP:

#!/usr/bin/env php
echo "Hello world";

В первом случае мы прямо указали на программу, которая будет выполнять команды, в двух следующих мы не знаем точный адрес программы, поэтому просим утилиту env найти ее по имени и запустить. Такой подход используется во многих скриптах. Но это еще не все. В системе Linux, чтобы система могла выполнить скрипт, нужно установить на файл с ним флаг исполняемый.

Этот флаг ничего не меняет в самом файле, только говорит системе, что это не просто текстовый файл, а программа и ее нужно выполнять, открыть файл, узнать интерпретатор и выполнить. Если интерпретатор не указан, будет по умолчанию использоваться интерпретатор пользователя. Но поскольку не все используют bash, нужно указывать это явно.

Чтобы сделать файл исполняемым в linux выполните:

chmod ugo+x файл_скрипта

Теперь выполняем нашу небольшую первую программу:

./файл_скрипта

bash

Все работает. Вы уже знаете как написать маленький скрипт, скажем для обновления. Как видите, скрипты содержат те же команды, что и выполняются в терминале, их писать очень просто. Но теперь мы немного усложним задачу. Поскольку скрипт, это программа, ему нужно самому принимать некоторые решения, хранить результаты выполнения команд и выполнять циклы. Все это позволяет делать оболочка Bash. Правда, тут все намного сложнее. Начнем с простого.

Переменные в скриптах

Написание скриптов на Bash редко обходится без сохранения временных данных, а значит создания переменных. Без переменных не обходится ни один язык программирования и наш примитивный язык командной оболочки тоже.

Возможно, вы уже раньше встречались с переменными окружения. Так вот, это те же самые переменные и работают они аналогично.

Например, объявим переменную string:

string="Hello world"

Значение нашей строки в кавычках. Но на самом деле кавычки не всегда нужны. Здесь сохраняется главный принцип bash — пробел — это специальный символ, разделитель, поэтому если не использовать кавычки world уже будет считаться отдельной командой, по той же причине мы не ставим пробелов перед и после знака равно.

Чтобы вывести значение переменной используется символ $. Например:

echo $string

Модифицируем наш скрипт:

#!/bin/bash
string1="hello "
string2=world
string=$string1$string2
echo $string

И проверяем:

./script

Hello world

Bash не различает типов переменных так, как языки высокого уровня, например, С++, вы можете присвоить переменной как число, так и строку. Одинаково все это будет считаться строкой. Оболочка поддерживает только слияние строк, для этого просто запишите имена переменных подряд:

#!/bin/bash
string1="hello "
string2=world
string=$string1$string2 and me
string3=$string1$string2" and me"
echo $string3

bash2

Проверяем:

./script

Обратите внимание, что как я и говорил, кавычки необязательны если в строке нет спецсимволов. Присмотритесь к обоим способам слияния строк, здесь тоже демонстрируется роль кавычек. Если же вам нужны более сложные способы обработки строк или арифметические операции, это не входит в возможности оболочки, для этого используются обычные утилиты.

Переменные и вывод команд

Переменные не были бы настолько полезны, если бы в них невозможно было записать результат выполнения утилит. Для этого используется такой синтаксис:

$(команда)

С помощью этой конструкции вывод команды будет перенаправлен прямо туда, откуда она была вызвана, а не на экран. Например, утилита date возвращает текущую дату. Эти команды эквивалентны:

date

echo $(date)

bash3

Понимаете? Напишем скрипт, где будет выводиться hello world и дата:

#!/bin/bash
string1="hello world "
string2=$(date)
string=$string1$string2
echo $string

bash4

Теперь вы знаете достаточно о переменных, и готовы создать bash скрипт, но это еще далеко не все. Дальше мы рассмотрим параметры и управляющие конструкции. Напомню, что это все обычные команды bash, и вам необязательно сохранять их в файле, можно выполнять сразу же на ходу.

Параметры скрипта

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

Переменная с именем 1 содержит значение первого параметра, переменная 2, второго и так далее. Этот bash скрипт выведет значение первого параметра:

#!/bin/bash
echo $1

bash6

bash5

Управляющие конструкции в скриптах

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

В Bash для проверки условий есть команда Синтаксис ее такой:

if команда_условие
then
команда
else
команда
fi

Эта команда проверяет код завершения команды условия, и если 0 (успех) то выполняет команду или несколько команд после слова then, если код завершения 1 выполняется блок else, fi означает завершение блока команд.

Но поскольку нам чаще всего нас интересует не код возврата команды, а сравнение строк и чисел, то была введена команда [[, которая позволяет выполнять различные сравнения и выдавать код возврата зависящий от результата сравнения. Ее синтаксис:

[[ параметр1 оператор параметр2 ]]

Для сравнения используются уже привычные нам операторы <,>,=,!= и т д. Если выражение верно, команда вернет 0, если нет — 1. Вы можете немного протестировать ее поведение в терминале. Код возврата последней команды хранится в переменной $?:

bash7

Теперь объединением все это и получим скрипт с условным выражением:

#!/bin/bash
if [[ $1 > 2 ]]
then
echo $1" больше 2"
else
echo $1" меньше 2 или 2"
fi

bash8

bash9

Конечно, у этой конструкции более мощные возможности, но это слишком сложно чтобы рассматривать их в этой статье. Возможно, я напишу об этом потом. А пока перейдем к циклам.

Циклы в скриптах

Преимущество программ в том, что мы можем в несколько строчек указать какие действия нужно выполнить несколько раз. Например, возможно написание скриптов на bash, которые состоят всего из нескольких строчек, а выполняются часами, анализируя параметры и выполняя нужные действия.

Первым рассмотрим цикл for. Вот его синтаксис:

for переменная in список
do
команда
done

Перебирает весь список, и присваивает по очереди переменной значение из списка, после каждого присваивания выполняет команды, расположенные между do и done.

Например, переберем пять цифр:

#!/bin/bash
for index in 1 2 3 4 5
do
echo $index
done

bash10

bash11

Или вы можете перечислить все файлы из текущей директории:

for file in $(ls -l); do echo "$file"; done

bash12

Как вы понимаете, можно не только выводить имена, но и выполнять нужные действия, это очень полезно когда выполняется создание bash скрипта.

Второй цикл, который мы рассмотрим — это цикл while, он выполняется пока команда условия возвращает код 0, успех. Рассмотрим синтаксис:

while команда условие
do
команда
done

Рассмотрим пример:

#!/bin/bash
index=1
while [[ $index < 5 ]]
do
echo $index
let "index=index+1"
done

bash14

bash13

Как видите, все выполняется, команда let просто выполняет указанную математическую операцию, в нашем случае увеличивает значение переменной на единицу.

Хотелось бы отметить еще кое-что. Такие конструкции, как while, for, if рассчитаны на запись в несколько строк, и если вы попытаетесь их записать в одну строку, то получите ошибку. Но тем не менее это возможно, для этого там, где должен быть перевод строки ставьте точку с запятой «;». Например, предыдущий цикл можно было выполнить в виде одной строки:

index=1; while [[ $index < 5 ]]; do echo $index; let "index=index+1"; done;

Все очень просто я пытался не усложнять статью дополнительными терминами и возможностями bash, только самое основное. В некоторых случаях, возможно, вам понадобиться сделать gui для bash скрипта, тогда вы можете использовать такие программы как zenity или kdialog, с помощью них очень удобно выводить сообщения пользователю и даже запрашивать у него информацию.

Выводы

Теперь вы понимаете основы создания скрипта в linux и можете написать нужный вам скрипт, например, для резервного копирования. Я пытался рассматривать bash скрипты с нуля. Поэтому далеко не все аспекты были рассмотрены. Возможно, мы еще вернемся к этой теме в одной из следующих статей.

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи, управление сценариями
Bash-скрипты, часть 6: функции и разработка библиотек
Bash-скрипты, часть 7: sed и обработка текстов
Bash-скрипты, часть 8: язык обработки данных awk
Bash-скрипты, часть 9: регулярные выражения
Bash-скрипты, часть 10: практические примеры
Bash-скрипты, часть 11: expect и автоматизация интерактивных утилит

Сегодня поговорим о bash-скриптах. Это — сценарии командной строки, написанные для оболочки bash. Существуют и другие оболочки, например — zsh, tcsh, ksh, но мы сосредоточимся на bash. Этот материал предназначен для всех желающих, единственное условие — умение работать в командной строке Linux.

Сценарии командной строки — это наборы тех же самых команд, которые можно вводить с клавиатуры, собранные в файлы и объединённые некоей общей целью. При этом результаты работы команд могут представлять либо самостоятельную ценность, либо служить входными данными для других команд. Сценарии — это мощный способ автоматизации часто выполняемых действий.

Итак, если говорить о командной строке, она позволяет выполнить несколько команд за один раз, введя их через точку с запятой:

pwd ; whoami

На самом деле, если вы опробовали это в своём терминале, ваш первый bash-скрипт, в котором задействованы две команды, уже написан. Работает он так. Сначала команда pwd выводит на экран сведения о текущей рабочей директории, потом команда whoamiпоказывает данные о пользователе, под которым вы вошли в систему.

Используя подобный подход, вы можете совмещать сколько угодно команд в одной строке, ограничение — лишь в максимальном количестве аргументов, которое можно передать программе. Определить это ограничение можно с помощью такой команды:

getconf ARG_MAX

Командная строка — отличный инструмент, но команды в неё приходится вводить каждый раз, когда в них возникает необходимость. Что если записать набор команд в файл и просто вызывать этот файл для их выполнения? Собственно говоря, тот файл, о котором мы говорим, и называется сценарием командной строки.

Как устроены bash-скрипты

Создайте пустой файл с использованием команды touch. В его первой строке нужно указать, какую именно оболочку мы собираемся использовать. Нас интересует bash, поэтому первая строка файла будет такой:

#!/bin/bash

В других строках этого файла символ решётки используется для обозначения комментариев, которые оболочка не обрабатывает. Однако, первая строка — это особый случай, здесь решётка, за которой следует восклицательный знак (эту последовательность называют шебанг) и путь к bash, указывают системе на то, что сценарий создан именно для bash.

Команды оболочки отделяются знаком перевода строки, комментарии выделяют знаком решётки. Вот как это выглядит:

#!/bin/bash
# This is a comment
pwd
whoami

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

Установка разрешений для файла сценария

Сохраните файл, дав ему имя myscript, и работа по созданию bash-скрипта почти закончена. Сейчас осталось лишь сделать этот файл исполняемым, иначе, попытавшись его запустить, вы столкнётесь с ошибкой Permission denied.

Попытка запуска файла сценария с неправильно настроенными разрешениями

Сделаем файл исполняемым:

chmod +x ./myscript

Теперь попытаемся его выполнить:

./myscript

После настройки разрешений всё работает как надо.

Успешный запуск bash-скрипта

Вывод сообщений

Для вывода текста в консоль Linux применяется команда echo. Воспользуемся знанием этого факта и отредактируем наш скрипт, добавив пояснения к данным, которые выводят уже имеющиеся в нём команды:

#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami

Вот что получится после запуска обновлённого скрипта.

Вывод сообщений из скрипта

Теперь мы можем выводить поясняющие надписи, используя команду echo. Если вы не знаете, как отредактировать файл, пользуясь средствами Linux, или раньше не встречались с командой echo, взгляните на этот материал.

Использование переменных

Переменные позволяют хранить в файле сценария информацию, например — результаты работы команд для использования их другими командами.

Нет ничего плохого в исполнении отдельных команд без хранения результатов их работы, но возможности такого подхода весьма ограничены.

Существуют два типа переменных, которые можно использовать в bash-скриптах:

  • Переменные среды
  • Пользовательские переменные

Переменные среды

Иногда в командах оболочки нужно работать с некими системными данными. Вот, например, как вывести домашнюю директорию текущего пользователя:

#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

Обратите внимание на то, что мы можем использовать системную переменную $HOME в двойных кавычках, это не помешает системе её распознать. Вот что получится, если выполнить вышеприведённый сценарий.

Использование переменной среды в сценарии

А что если надо вывести на экран значок доллара? Попробуем так:

echo "I have $1 in my pocket"

Система обнаружит знак доллара в строке, ограниченной кавычками, и решит, что мы сослались на переменную. Скрипт попытается вывести на экран значение неопределённой переменной $1. Это не то, что нам нужно. Что делать?

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

echo "I have $1 in my pocket"

Теперь сценарий выведет именно то, что ожидается.

Использование управляющей последовательности для вывода знака доллара

Пользовательские переменные

В дополнение к переменным среды, bash-скрипты позволяют задавать и использовать в сценарии собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария.

Как и в случае с системными переменными, к пользовательским переменным можно обращаться, используя знак доллара:

#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"

Вот что получится после запуска такого сценария.

Пользовательские переменные в сценарии

Подстановка команд

Одна из самых полезных возможностей bash-скриптов — это возможность извлекать информацию из вывода команд и назначать её переменным, что позволяет использовать эту информацию где угодно в файле сценария.

Сделать это можно двумя способами.

  • С помощью значка обратного апострофа «`»
  • С помощью конструкции $()

Используя первый подход, проследите за тем, чтобы вместо обратного апострофа не ввести одиночную кавычку. Команду нужно заключить в два таких значка:

mydir=`pwd`

При втором подходе то же самое записывают так:

mydir=$(pwd)

А скрипт, в итоге, может выглядеть так:

#!/bin/bash
mydir=$(pwd)
echo $mydir

В ходе его работы вывод команды pwdбудет сохранён в переменной mydir, содержимое которой, с помощью команды echo, попадёт в консоль.

Скрипт, сохраняющий результаты работы команды в переменной

Математические операции

Для выполнения математических операций в файле скрипта можно использовать конструкцию вида $((a+b)):

#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2

Математические операции в сценарии

Управляющая конструкция if-then

В некоторых сценариях требуется управлять потоком исполнения команд. Например, если некое значение больше пяти, нужно выполнить одно действие, в противном случае — другое. Подобное применимо в очень многих ситуациях, и здесь нам поможет управляющая конструкция if-then. В наиболее простом виде она выглядит так:

if команда
then
команды
fi

А вот рабочий пример:

#!/bin/bash
if pwd
then
echo "It works"
fi

В данном случае, если выполнение команды pwdзавершится успешно, в консоль будет выведен текст «it works».

Воспользуемся имеющимися у нас знаниями и напишем более сложный сценарий. Скажем, надо найти некоего пользователя в /etc/passwd, и если найти его удалось, сообщить о том, что он существует.

#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi

Вот что получается после запуска этого скрипта.

Поиск пользователя

Здесь мы воспользовались командой grepдля поиска пользователя в файле /etc/passwd. Если команда grepвам незнакома, её описание можно найти здесь.

В этом примере, если пользователь найден, скрипт выведет соответствующее сообщение. А если найти пользователя не удалось? В данном случае скрипт просто завершит выполнение, ничего нам не сообщив. Хотелось бы, чтобы он сказал нам и об этом, поэтому усовершенствуем код.

Управляющая конструкция if-then-else

Для того, чтобы программа смогла сообщить и о результатах успешного поиска, и о неудаче, воспользуемся конструкцией if-then-else. Вот как она устроена:

if команда
then
команды
else
команды
fi

Если первая команда возвратит ноль, что означает её успешное выполнение, условие окажется истинным и выполнение не пойдёт по ветке else. В противном случае, если будет возвращено что-то, отличающееся от нуля, что будет означать неудачу, или ложный результат, будут выполнены команды, расположенные после else.

Напишем такой скрипт:

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi

Его исполнение пошло по ветке else.

Запуск скрипта с конструкцией if-then-else

Ну что же, продолжаем двигаться дальше и зададимся вопросом о более сложных условиях. Что если надо проверить не одно условие, а несколько? Например, если нужный пользователь найден, надо вывести одно сообщение, если выполняется ещё какое-то условие — ещё одно сообщение, и так далее. В подобной ситуации нам помогут вложенные условия. Выглядит это так:

if команда1
then
команды
elif команда2
then
команды
fi

Если первая команда вернёт ноль, что говорит о её успешном выполнении, выполнятся команды в первом блоке then, иначе, если первое условие окажется ложным, и если вторая команда вернёт ноль, выполнится второй блок кода.

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi

В подобном скрипте можно, например, создавать нового пользователя с помощью команды useradd, если поиск не дал результатов, или делать ещё что-нибудь полезное.

Сравнение чисел

В скриптах можно сравнивать числовые значения. Ниже приведён список соответствующих команд.

n1 -eq n2Возвращает истинное значение, если n1 равно n2.
n1 -ge n2 Возвращает истинное значение, если n1больше или равно n2.
n1 -gt n2Возвращает истинное значение, если n1 больше n2.
n1 -le n2Возвращает истинное значение, если n1меньше или равно n2.
n1 -lt n2Возвращает истинное значение, если n1 меньше n2.
n1 -ne n2Возвращает истинное значение, если n1не равно n2.

В качестве примера опробуем один из операторов сравнения. Обратите внимание на то, что выражение заключено в квадратные скобки.

#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fi

Вот что выведет эта команда.

Сравнение чисел в скриптах

Значение переменной val1больше чем 5, в итоге выполняется ветвь thenоператора сравнения и в консоль выводится соответствующее сообщение.

Сравнение строк

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

str1 = str2 Проверяет строки на равенство, возвращает истину, если строки идентичны.
str1 != str2Возвращает истину, если строки не идентичны.
str1 < str2Возвращает истину, если str1меньше, чем str2.
str1 > str2 Возвращает истину, если str1больше, чем str2.
-n str1 Возвращает истину, если длина str1больше нуля.
-z str1Возвращает истину, если длина str1равна нулю.

Вот пример сравнения строк в сценарии:

#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fi

В результате выполнения скрипта получим следующее.

Сравнение строк в скриптах

Вот одна особенность сравнения строк, о которой стоит упомянуть. А именно, операторы «>» и «<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>» как команду перенаправления вывода.

Вот как работа с этими операторами выглядит в коде:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Вот результаты работы скрипта.

Сравнение строк, выведенное предупреждение

Обратите внимание на то, что скрипт, хотя и выполняется, выдаёт предупреждение:

./myscript: line 5: [: too many arguments

Для того, чтобы избавиться от этого предупреждения, заключим $val2 в двойные кавычки:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Теперь всё работает как надо.

Сравнение строк

Ещё одна особенность операторов «>» и «<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Likegeeks
likegeeks

Сохраним его, дав имя myfile, после чего выполним в терминале такую команду:

sort myfile

Она отсортирует строки из файла так:

likegeeks
Likegeeks

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

#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Если его запустить, окажется, что всё наоборот — строчная буква теперь больше прописной.

Команда sort и сравнение строк в файле сценария

В командах сравнения прописные буквы меньше строчных. Сравнение строк здесь выполняется путём сравнения ASCII-кодов символов, порядок сортировки, таким образом, зависит от кодов символов.

Команда sort, в свою очередь, использует порядок сортировки, заданный в настройках системного языка.

Проверки файлов

Пожалуй, нижеприведённые команды используются в bash-скриптах чаще всего. Они позволяют проверять различные условия, касающиеся файлов. Вот список этих команд.

-d fileПроверяет, существует ли файл, и является ли он директорией.
-e fileПроверяет, существует ли файл.
-f file Проверяет, существует ли файл, и является ли он файлом.
-r fileПроверяет, существует ли файл, и доступен ли он для чтения.
-s file Проверяет, существует ли файл, и не является ли он пустым.
-w fileПроверяет, существует ли файл, и доступен ли он для записи.
-x fileПроверяет, существует ли файл, и является ли он исполняемым.
file1 -nt file2 Проверяет, новее ли file1, чем file2.
file1 -ot file2Проверяет, старше ли file1, чем file2.
-O file Проверяет, существует ли файл, и является ли его владельцем текущий пользователь.
-G fileПроверяет, существует ли файл, и соответствует ли его идентификатор группы идентификатору группы текущего пользователя.

Эти команды, как впрочем, и многие другие рассмотренные сегодня, несложно запомнить. Их имена, являясь сокращениями от различных слов, прямо указывают на выполняемые ими проверки.

Опробуем одну из команд на практике:

#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fi

Этот скрипт, для существующей директории, выведет её содержимое.

Вывод содержимого директории

Полагаем, с остальными командами вы сможете поэкспериментировать самостоятельно, все они применяются по тому же принципу.

Итоги

Сегодня мы рассказали о том, как приступить к написанию bash-скриптов и рассмотрели некоторые базовые вещи. На самом деле, тема bash-программирования огромна. Эта статья является переводом первой части большой серии из 11 материалов. Если вы хотите продолжения прямо сейчас — вот список оригиналов этих материалов. Для удобства сюда включён и тот, перевод которого вы только что прочли.

  1. Bash Script Step By Step — здесь речь идёт о том, как начать создание bash-скриптов, рассмотрено использование переменных, описаны условные конструкции, вычисления, сравнения чисел, строк, выяснение сведений о файлах.
  2. Bash Scripting Part 2, Bash the awesome — тут раскрываются особенности работы с циклами for и while.
  3. Bash Scripting Part 3, Parameters & options — этот материал посвящён параметрам командной строки и ключам, которые можно передавать скриптам, работе с данными, которые вводит пользователь, и которые можно читать из файлов.
  4. Bash Scripting Part 4, Input & Output — здесь речь идёт о дескрипторах файлов и о работе с ними, о потоках ввода, вывода, ошибок, о перенаправлении вывода.
  5. Bash Scripting Part 5, Sighals & Jobs — этот материал посвящён сигналам Linux, их обработке в скриптах, запуску сценариев по расписанию.
  6. Bash Scripting Part 6, Functions — тут можно узнать о создании и использовании функций в скриптах, о разработке библиотек.
  7. Bash Scripting Part 7, Using sed — эта статья посвящена работе с потоковым текстовым редактором sed.
  8. Bash Scripting Part 8, Using awk — данный материал посвящён программированию на языке обработки данных awk.
  9. Bash Scripting Part 9, Regular Expressions — тут можно почитать об использовании регулярных выражений в bash-скриптах.
  10. Bash Scripting Part 10, Practical Examples — здесь приведены приёмы работы с сообщениями, которые можно отправлять пользователям, а так же методика мониторинга диска.
  11. Bash Scripting Part 11, Expect Command — этот материал посвящён средству Expect, с помощью которого можно автоматизировать взаимодействие с интерактивными утилитами. В частности, здесь идёт речь об expect-скриптах и об их взаимодействии с bash-скриптами и другими программами.

Полагаем, одно из ценных свойств этой серии статей заключается в том, что она, начинаясь с самого простого, подходящего для пользователей любого уровня, постепенно ведёт к довольно серьёзным темам, давая шанс всем желающим продвинуться в деле создания сценариев командной строки Linux.

Уважаемые читатели! Просим гуру bash-программирования рассказать о том, как они добрались до вершин мастерства, поделиться секретами, а от тех, кто только что написал свой первый скрипт, ждём впечатлений.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Переводить остальные части цикла статей?

Проголосовали 1540 пользователей.

Воздержались 124 пользователя.

Прежде всего давайте разберём, что такое script и для чего он нужен.

Script в переводе с английского — сценарий. Все мы смотрим фильмы, многие из нас — спектакли. Чтобы создать фильм/спектакль, сценаристы пишут к ним сценарии, на основании которых артисты, сценка за сценкой исполняют на сцене свои роли, из чего и складывается фильм/спектакль. Работа по созданию сценария довольно кропотливая, где нужно учесть всё до мелочей, чтобы в конечном итоге артисты могли выполнить задуманное сценаристом, а зритель увидел целостное произведение.

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

Для начала давайте создадим самый, что ни на есть, простейший скрипт-Shell для обновления системы.

Все действия я буду проводить с системе Ubuntu, но они применимы и к другим системам Linux, производных от Ubuntu. Для этого нам понадобятся: Текстовый редактор, чтобы наполнить его нужными задачами для создания скрипта (кода) и Терминал — для выполнения созданного скрипта. Эти инструменты установлены в любом дистрибутие Linux по умолчанию.

Итак, открываем текстовый редактор Gedit и вводим в него первые обязательные символы под названием shebang.
shebang в программировании, это последовательность из двух символов: решётки и восклицательного знака (#!) в начале файла скрипта. И добавляем к данным символам без пробелов /bin/sh — интерпретатор, где будет выполняться скрипт. /bin/sh — это обычно Bourne shell или совместимый интерпретатор командной строки, который передаёт «path/to/script» как первый параметр.
Первая обязательная строка скрипта будет выглядеть следующим образом:

#!/bin/sh

Далее, следующей строкой следует описание того, что должен выполнить наш первый скрипт/сценарий:

# Мой первый Script обновления Ubuntu

Знак решётки (#) в самом начале строки даёт понять интерпретатору/терминалу, что эту строку читать и выполнять не нужно. Строка нужна в коде данного скрипта для того чтобы сам создатель скрипта знал, что он собирается выполнить на данном отрезке/сценке в коде, чтобы не запутаться в дальнейшем, когда таких строк будет много. Такие строки с знаком решётки называются —

закомментированные

.

Далее в скрипте следуют выполняемые строки с командами, в данном случае для обновления системы Ubuntu:

sudo apt update
sudo apt upgrade -y

-y в конце второй команды даёт понять интерпретатору/терминалу, что это действие/команду нужно выполнить автоматически, без дополнительного подтверждения пользователем, нажатия  клавиши Ввод. y — сокращённо от английского yes, т.е. да.

Вот и всё. Ваш первый скрипт создан. У вас должно получиться как на снимке:

Остаётся сохранить созданный файл/скрипт и дать ему Имя с обязательным расширением в конце — .sh. Расширение .sh присваивается исполняемому файлу.
Я дал ему Имяобновление.sh, сохранив в Домашней папке пользователя:

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

1. Выполнить следующую команду в терминале:


sudo chmod +x обновление.sh

2. Либо открыть  файловый менеджер в Домашней папке (где вы сохранили созданный скрипт), правый клик на файле, в контекстном меню — Свойства — Права и активировать пункт — Выполнение: Разрешить выполнение файла как программы:

Чтобы выполнить созданный скрипт, нужно открыть терминал ( о чём я писал в самом начале статьи, что терминал — необходимый атрибут/инструмент для выполнения скрипта), ввести sh, через пробел название скрипта — обновление.sh и нажать клавишу Ввод:

Либо в терминале вводим sh и перетаскиваем из файлового менеджера созданный файл с скриптом (также через пробел):

После того как путь к файлу отобразится после команды sh и пробела, достаточно нажать клавишу Enter (Ввод), чтобы выполнить обновление системы:

Теперь в любой момент вы можете сделать обновление системы созданным собственным скриптом.

Да, кто-то может возразить, что обновление системы не сложно сделать выполнением этих двух команд в терминале, зачем пыжиться и создавать какие-то скрипты? Всё верно. Но это пример создания простейшего скрипта, чтобы показать, что «не боги горшки обжигают» 😃.

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

Многие из вас, скорее всего, пользуются сайтами по настройке системы, типа тех что я публикую после выхода очередного релиза UbuntuUbuntu после установки или подобными сайтами. Откройте один из таких сайтов: http://compizomania.blogspot.com/2016/04/ubuntu-1604.html, затем текстовый редактор для создания скрипта.
Для примера я сделал следующую заготовку.

В текстовом редакторе вводим первую обязательную строку:

#!/bin/bash

Далее закомментированные строки с описанием:

# Настройка Ubuntu после уставновки
# Обновление системы

Ниже следуют команды обновления системы:

sudo apt update
sudo apt upgrade -y

Строка описания: Добавление репозиториев:

# Добавление репозиториев

И добавляете необходимые репозитории для дальнейшей установки программного обеспечения:

sudo add-apt-repository «deb http://archive.canonical.com/ $(lsb_release -sc) partner» -y
sudo add-apt-repository ppa:atareao/telegram -y
sudo add-apt-repository ppa:atareao/atareao -y

sudo add-apt-repository ppa:nemh/systemback -y
sudo add-apt-repository ppa:gerardpuig/ppa -y
sudo add-apt-repository ppa:haecker-felix/gradio-daily -y

После того как необходимые репозитории добавлены (повторюсь, у вас могут быть свои репозитории, у меня пример), необходимо обновить систему:

Строка с описанием:

# Обновление системы после подключения репозиториев

И команда на выполнение:

sudo apt update

Теперь, когда репозитории добавлены и система обновлена, наступила очередь в установке программ:

# Установка программ

Для установки программ достаточно один раз ввести команду sudo apt install, а затем через пробел в данную строку добавлять сколько угодно программ, главное чтобы они были правильно составлены. Если какая-то программа состоит из нескольких слов, её команда должна быть монолитной, т.е. все слова в ней должны вводится через чёрточку, например: unity-tweak-tool:

sudo apt install my-weather-indicator telegram skype lm-sensors hddtemp psensor gdebi systemback unity-tweak-tool ubuntu-cleaner gradio -y

Установка дополнительных кодеков

# Мультимедиа и кодеки

sudo apt install ubuntu-restricted-extras -y

Отключение о сбоях в системе

# Отключить отчёты о сбоях в системе

sudo sed -i «s/enabled=1/enabled=0/g» ‘/etc/default/apport’

Ну вот, пожалуй, и всё. Данный созданный файл сценария должен выглядеть следующим образом:

Необходимо сохранить его (нажать кнопку Сохранить) и дать Имя с расширением .sh. Я назвал его Настройка Ubuntu.sh (вы можете назвать по-другому, но обязвтельно с расширением .sh):

Делаем созданный скрипт исполняемым:

sudo chmod +x Настройка Ubuntu.sh

Для выполнения созданного скрипта введите в терминале sh и название созданного скрипта через пробел, либо sh, пробел и перетащить в терминал созданный файл, как объяснялось ранее в простейшем скрипте и нажмите клавишу Ввод, для его выполнения.

Примечание. Обратный слэш в команде Настройка Ubuntu.sh экранирует пробел в названии файла для терминала между двумя отдельными словами.

После того как скрипт будет выполнен, хранить его на будущее, для возможной переустановки системы и повторной настройки, лучше всего на отдельном разделе ж/диска в папке /home. Если таковой нет, то в облачном сервисе (Облачное хранилище данных) типа:  DropBox, Облако Mail.Ru, Mega.co и т.п., чтобы в любой момент воспользоваться скриптом самому, либо помочь знакомым или родственникам в настройке системы.

Удачи.


Download Article


Download Article

Have you ever wanted to automate operations in your operating system? Have you ever wanted to write a program that could create a file and copy that file to a specific directory? Have you ever thought about doing these tasks using the BASH Shell in Ubuntu? If so, then this is the article for you!

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 1

    Launch the Terminal. You can launch the terminal by opening the dash and searching for it by name. You could also open it using the keyboard shortcut Ctrl+Alt+T.

  2. Advertisement

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 3

    Launch the vi or vim editor and create a new script. Vim is a free and popular text editor that uses the command line interface. To create a script called ListDir.sh:

    • Type vim ListDir.sh and hit Enter.
    • Once inside the Editor, type «I» or «i.» This will allow you to insert/start typing your shell script.
  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 4

    Type the following code: #!/bin/bash. This is known as a Shebang line.

  2. Advertisement

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 5

    Type the code as shown in the figure. The first line (echo «Welcome») prints the line «Welcome» into the terminal. echo is used to return the given text and a new line. The second line (ls) lists the contents of the directory. ls is short for list. The final line (another echo statement) returns the text This completes the list of directories.

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 6

    Exit vim. Type Esc, then :, and then + wq to save and quit. This will write the changes to the file and bring you back to the terminal. Save the file as ListDir.sh

  2. Advertisement

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 7

    Change the permissions. Enter the following command: chmod +x ListDir.sh. chmod is a command used in Unix like operating systems to change the access permissions to a file.

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 8

    Run the script from the command line. Type ./ListDir.sh to run this script. You should get the list of directories and the message as shown in the above image.

  2. Advertisement

Add New Question

  • Question

    After typing in «sudo apt install», «(sudo) password for jenneta» appears. What do I do?

    Living Concrete

    Living Concrete

    Top Answerer

    It is prompting you for the password to your account. Type in your password and then press Enter.

  • Question

    How do I learn shell scripting?

    Aryaa Vashisth

    Aryaa Vashisth

    Community Answer

    Install Python shell scripting and watch tutorials of how to script on Python.

  • Question

    How? I would like to stop the «file already exists» function at the OS level and instead rename the file on the disk before writing whatever to the original file name specified.

    Nithik Ramesh

    Nithik Ramesh

    Community Answer

    You may have a file of the exact same name and that is why it shows up. Try using another name for your shell script «vim » Or if you want to rename an existing file, do «mv » without the quotes and the angular brackets.

Ask a Question

200 characters left

Include your email address to get a message when this question is answered.

Submit

Advertisement

  • By default, vim is not installed.

  • Use vim <yourfile.sh> to edit your shell scripts.

  • Enter your password and let Ubuntu do the magic.

Show More Tips

Thanks for submitting a tip for review!

Advertisement

  • For starters, place your shell scripts in your home directory as you begin your shell script journey. Once comfortable, place them in your required directory system.

  • Ensure that the files you create, do not reside in any system directories of the / = root file system.

Advertisement

About This Article

Thanks to all authors for creating a page that has been read 267,876 times.

Is this article up to date?


Download Article


Download Article

Have you ever wanted to automate operations in your operating system? Have you ever wanted to write a program that could create a file and copy that file to a specific directory? Have you ever thought about doing these tasks using the BASH Shell in Ubuntu? If so, then this is the article for you!

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 1

    Launch the Terminal. You can launch the terminal by opening the dash and searching for it by name. You could also open it using the keyboard shortcut Ctrl+Alt+T.

  2. Advertisement

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 3

    Launch the vi or vim editor and create a new script. Vim is a free and popular text editor that uses the command line interface. To create a script called ListDir.sh:

    • Type vim ListDir.sh and hit Enter.
    • Once inside the Editor, type «I» or «i.» This will allow you to insert/start typing your shell script.
  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 4

    Type the following code: #!/bin/bash. This is known as a Shebang line.

  2. Advertisement

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 5

    Type the code as shown in the figure. The first line (echo «Welcome») prints the line «Welcome» into the terminal. echo is used to return the given text and a new line. The second line (ls) lists the contents of the directory. ls is short for list. The final line (another echo statement) returns the text This completes the list of directories.

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 6

    Exit vim. Type Esc, then :, and then + wq to save and quit. This will write the changes to the file and bring you back to the terminal. Save the file as ListDir.sh

  2. Advertisement

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 7

    Change the permissions. Enter the following command: chmod +x ListDir.sh. chmod is a command used in Unix like operating systems to change the access permissions to a file.

  1. Image titled Write a Shell Script Using Bash Shell in Ubuntu Step 8

    Run the script from the command line. Type ./ListDir.sh to run this script. You should get the list of directories and the message as shown in the above image.

  2. Advertisement

Add New Question

  • Question

    After typing in «sudo apt install», «(sudo) password for jenneta» appears. What do I do?

    Living Concrete

    Living Concrete

    Top Answerer

    It is prompting you for the password to your account. Type in your password and then press Enter.

  • Question

    How do I learn shell scripting?

    Aryaa Vashisth

    Aryaa Vashisth

    Community Answer

    Install Python shell scripting and watch tutorials of how to script on Python.

  • Question

    How? I would like to stop the «file already exists» function at the OS level and instead rename the file on the disk before writing whatever to the original file name specified.

    Nithik Ramesh

    Nithik Ramesh

    Community Answer

    You may have a file of the exact same name and that is why it shows up. Try using another name for your shell script «vim » Or if you want to rename an existing file, do «mv » without the quotes and the angular brackets.

Ask a Question

200 characters left

Include your email address to get a message when this question is answered.

Submit

Advertisement

  • By default, vim is not installed.

  • Use vim <yourfile.sh> to edit your shell scripts.

  • Enter your password and let Ubuntu do the magic.

Show More Tips

Thanks for submitting a tip for review!

Advertisement

  • For starters, place your shell scripts in your home directory as you begin your shell script journey. Once comfortable, place them in your required directory system.

  • Ensure that the files you create, do not reside in any system directories of the / = root file system.

Advertisement

About This Article

Thanks to all authors for creating a page that has been read 267,876 times.

Is this article up to date?

  • Главная

  • Инструкции

  • Linux

  • Написание скриптов в Linux Bash

Когда вы часто используете одни и те же команды в терминале Linux, самое время подумать о создании скриптов для автоматизации повседневных рутинных задач. На самом простом уровне shell скриптинг — это просто набор команд, помещенных в файл, который при выполнении в виде программы будет выполнять каждую отдельную команду по порядку.

Написание Скриптов В Linux Bash (1)

Пример выполнения нескольких команд в оболочке:

timeweb@localhost:~$ date;who;uptime        

Wed Jan 19 01:53:56 UTC 2022                                                   
timeweb console      Nov 30 22:49                                         
01:53:56 up 19 days,  9:07,  1 user,  load average: 0.03, 0.05, 0.05

Чтобы создать скрипт из этих команд, просто поместите их в файл и сделайте его исполняемым:

timeweb@localhost:~$ echo 'date;who;uptime' > script.sh   
timeweb@localhost:~$ chmod +x ./script.sh  
timeweb@localhost:~$ ./script.sh                                                  

Wed Jan 19 01:55:30 UTC 2022                                                   
timeweb console      Nov 30 22:49                                          
01:55:30 up 19 days,  9:08,  1 user,  load average: 0.05, 0.05, 0.05

       

Shell скриптинг может предоставлять мощные функции. В дополнение ко всем функциям, которая предоставляет интерактивная оболочка (т.е. переменные, псевдонимы, функции), системные администраторы также могут использовать функции программирования, такие как операторы if, циклы while и for.

Основы shell скриптинга

Чтобы создать сценарий командной оболочки, выполните следующие действия:

  •  Используйте текстовый редактор для создания файла с командами, которые вы хотите выполнить;
  •  Поместите следующую строку в начало файла, чтобы указать, что скрипт должен выполняться в командной оболочке bash.
#!/bin/bash
  •   Используйте команду chmod, чтобы сделать файл исполняемым:
chmod +x имя_файла

Первая строка скрипта должна содержать символы #!, которые сообщают системе путь к исполняемому файлу оболочки bash. Обычно символ знака # используется для комментария строки, но когда он помещается в начале первой строки и ему предшествует символ восклицательного знака !, то он используется для указания системе, какой исполняемый файл использовать для запуска программы.

 В следующем примере рассмотрим скрипт, который создаст отчет об использовании дискового пространства в каталоге /usr/share/doc.

timeweb@localhost:~/test$ cat report.sh
#!/bin/bash
cd /usr/share/doc
echo "Document directory usage report" > /tmp/report
date >> /tmp/report
pwd >> /tmp/report
du -sh . >> /tmp/report
timeweb@localhost:~/test$ chmod +x report.sh
timeweb@localhost:~/test$ ./report.sh
timeweb@localhost:~/test$ cat /tmp/report                                     
Document directory usage report                                            
Wed Jan 19 06:41:17 UTC 2022                                               
/usr/share/doc                                                              
6.6M .

Расположение скрипта

Обратите внимание, что для выполнения скрипта в предыдущем примере перед именем скрипта была помещена комбинация символов ./, указывающий текущий каталог. Хотя этот метод всегда можно использовать для запуска скрипта, рассмотрите возможность размещения скрипта в месте, указанном переменной PATH.

Точное значение переменной PATH будет варьироваться в зависимости от используемого дистрибутива Linux, а также от индивидуальных настроек, типичная переменная PATH будет включать следующие каталоги:

timeweb@localhost:~$ echo $PATH

/home/timeweb/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
/usr/games:/usr/local/games

С правами администратора скрипт может быть размещен в любом из каталогов, перечисленных в переменной PATH. Однако идеальным местом для скриптов, предназначенных для совместного использования обычными пользователями, будет каталог /usr/local/bin. А для скриптов, предназначенных для выполнения администраторами, поместите в каталог /usr/local/sbin.

Обычные пользователи не имеют прав размещать файлы в этих каталогах. Для собственных скриптов пользователя идеальным местом для размещения является его каталог /home/USER/bin, где USER — это имя текущей учетной записи пользователя. Например, системный администратор должен размещать скрипты у себя в каталоге /home/sysadmin/bin.

Разместив скрипты в этих каталогах, их будет легче найти, а также проще выполнить.

Разрешения скрипта

Как правило, скрипт должен иметь разрешение как на чтение, так и на выполнение для пользователя, который пытается его выполнить. В предыдущем примере команда chmod +x имя_файла предоставила разрешение на выполнение всем пользователям (предполагалось, что разрешение прав на чтение уже предоставлено всем пользователям).

Если сценарий предназначен для частного использования, рассмотрите возможность предоставления разрешения на выполнение только для пользователя: chmod u+x имя_файла.

Замена команд

Функция оболочки, которая очень полезна при создании скриптов, называется подстановкой команд. Это позволяет сценарию выполнять команду командной оболочки и перенаправлять вывод команды в переменную, вместо отображения вывода в терминале. Например, чтобы зафиксировать дату и время запуска и завершения сценария, используйте следующий синтаксис:

timeweb@localhost:~$ start=`date`  

Символы обратной кавычки вокруг данных указывают оболочке выполнить команду и заменить «дату» выводом команды «date». Затем этот вывод присваивается переменной start:

timeweb@localhost:~$ echo $start     

Wed Jan 19 02:19:05 UTC 2022

В оболочке bash вы также можете использовать синтаксис $(команда):

timeweb@localhost:~$ end=$(date)     
timeweb@localhost:~$ echo $start $end

Wed Jan 19 02:19:05 UTC 2022 Wed Jan 19 02:19:18 UTC 2022

Оба метода выполняют одну и ту же задачу; большинство программистов оболочки bash предпочитают использовать синтаксис $(command), поскольку считают, что его легче читать (обратные кавычки иногда выглядят как одинарные кавычки).

Подстановка команд также может быть использована для вставки выходных данных команды в качестве аргумента другой команды. Например:

timeweb@localhost:~$ echo "Today is $(date)"
Today is Wed Jan 19 02:29:00 UTC 2022

Это может быть полезно, если у вас есть файл, содержащий такие данные, например, имена пользователей, имена каталогов или имена файлов. В следующем примере файл dirs.txt содержит три имени каталога, которые передаются в команду du в качестве аргументов с помощью подстановки команд:

timeweb@localhost:~/test$ cat dirs.txt
/usr/share/doc                                                              
/usr/local                                                                 
/etc/magic                                                                 
timeweb@localhost:~/test$ du -sh $(cat dirs.txt)                           
6.6M /usr/share/doc                                                     
4.0K /usr/local                                                         
4.0K /etc/magic  

Хотя замена команд часто используется в командной строке, это также очень мощная функция написания сценариев оболочки. Следующий скрипт демонстрирует использование подстановки команд:

timeweb@localhost:~/test$ cat report2.sh    
#!/bin/bash                                                                
start=$(date)                                                              
cd /usr/share/doc                                                          
echo "Document directory usage report" > /tmp/report                       
du -sh $(cat ~/test/dirs.txt) >> /tmp/report                               
echo "Start of report: $start" >> /tmp/report                              
echo "End of report: $(date)" >> /tmp/report                               
timeweb@localhost:~/test$ ./report2.sh                                    
timeweb@localhost:~/test$ cat /tmp/report                                
Document directory usage report                                            
6.6M /usr/share/doc                                                     
4.0K /usr/local                                                          
4.0K /etc/magic                                                         
Start of report: Wed Jan 19 06:58:23 UTC 2022
End of report: Wed Jan 19 06:58:23 UTC 2022

Оператор чтения

Оператор чтения может использоваться для сбора информации от пользователя, выполняющего скрипт. Пользователю будет представлен “мигающий курсор”, который будет принимать ввод с клавиатуры и помещать то, что пользователь вводит, в одну или несколько переменных. Основной синтаксис команды чтения таков:

read variable

Например, следующая команда считывает введенные пользователем данные в переменную с именем:

read name

Пользователю было бы полезно знать, какой тип ввода запрашивается. Опция –p для команды read позволяет выдать приглашение:

read –p "Please enter your name: " name

В следующем примере пользовательский ввод используется для определения того, какое имя каталога использовать для выполнения команды du:

#!/bin/bash 
read -p "Enter a directory: " dir
start=$(date)
echo "Document directory usage report" > /tmp/report
du -sh $dir >> /tmp/report
echo "Start of report: $start" >> /tmp/report
echo "End of report: $(date)" >> /tmp/report
timeweb@localhost:~/test$ ./report3.sh                                    
Enter a directory: /etc/magic                                              
timeweb@localhost:~/test$ cat /tmp/report                                
Document directory usage report                                            
4.0K /etc/magic                                                         
Start of report: Wed Jan 19 07:03:56 UTC 2022
End of report: Wed Jan 19 07:03:56 UTC 2022

Понравилась статья? Поделить с друзьями:
  • Уверена или уверенна как правильно пишется
  • Убраться подобру поздорову как пишется
  • Уверен или уверин как пишется
  • Убраться восвояси как пишется
  • Уверен или уверенн как пишется