Логические операции в Linux

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/VersionControlandTextEditorsGroup(["Version Control and Text Editors"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicSystemCommandsGroup -.-> linux/test("Condition Testing") linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("Directory Creating") linux/VersionControlandTextEditorsGroup -.-> linux/nano("Simple Text Editing") subgraph Lab Skills linux/echo -.-> lab-271325{{"Логические операции в Linux"}} linux/test -.-> lab-271325{{"Логические операции в Linux"}} linux/touch -.-> lab-271325{{"Логические операции в Linux"}} linux/cat -.-> lab-271325{{"Логические операции в Linux"}} linux/chmod -.-> lab-271325{{"Логические операции в Linux"}} linux/cd -.-> lab-271325{{"Логические операции в Linux"}} linux/mkdir -.-> lab-271325{{"Логические операции в Linux"}} linux/nano -.-> lab-271325{{"Логические операции в Linux"}} end

Понимание базовых логических операций в Linux

Оболочка Linux предоставляет несколько способов комбинировать команды и условия с использованием логических операторов. На этом этапе вы узнаете о наиболее часто используемых логических операторах: && (И) и || (ИЛИ).

Сначала перейдем в наш проектный каталог:

cd ~/project

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

touch treasure_map.txt shield.txt kings_gauntlet.txt

Теперь создадим скрипт для демонстрации базовых логических операций. Мы будем использовать текстовый редактор nano для создания файла с именем logic_basics.sh:

nano logic_basics.sh

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

#!/bin/bash

## This script demonstrates logical AND (&&) and OR (||) operators
## It checks if two specific files exist in the current directory

if [[ -f "treasure_map.txt" ]] && [[ -f "shield.txt" ]]; then
  echo "Both files exist. Proceed with the mission."
else
  echo "One or both files are missing. Abort the mission!"
fi

Оператор && означает "И" - оба условия должны быть истинными, чтобы общее условие было истинным.
Тест -f проверяет, существует ли файл и является ли он обычным файлом (не директорией или другим специальным файлом).

Чтобы сохранить файл в nano, нажмите Ctrl+X, затем нажмите Y для подтверждения сохранения и Enter для подтверждения имени файла.

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

chmod +x logic_basics.sh
./logic_basics.sh

Вы должны увидеть следующий вывод:

Both files exist. Proceed with the mission.

Попробуем другой пример, чтобы лучше понять логические операторы. Создайте новый скрипт с именем logical_or.sh:

nano logical_or.sh

Добавьте следующее содержимое:

#!/bin/bash

## This script demonstrates the logical OR (||) operator
## It checks if at least one of two files exists

if [[ -f "treasure_map.txt" ]] || [[ -f "nonexistent_file.txt" ]]; then
  echo "At least one file exists."
else
  echo "Neither file exists."
fi

Оператор || означает "ИЛИ" - если хотя бы одно из условий истинно, то общее условие истинно.

Сохраните файл (Ctrl+X, Y, Enter), сделайте его исполняемым и запустите:

chmod +x logical_or.sh
./logical_or.sh

Вывод:

At least one file exists.

Это демонстрирует, что даже несмотря на то, что файл "nonexistent_file.txt" не существует, условие все еще истинно, потому что файл "treasure_map.txt" существует.

Логические операции с разрешениями файлов

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

Сначала создадим скрипт с именем permission_check.sh:

nano permission_check.sh

Добавьте следующее содержимое в скрипт:

#!/bin/bash

## This script checks read and write permissions on a file
## using logical operators

filename="kings_gauntlet.txt"

if [[ -r "$filename" ]] && [[ -w "$filename" ]]; then
  echo "You have read and write permissions on $filename."
elif [[ -r "$filename" ]] || [[ -w "$filename" ]]; then
  echo "You have limited permissions on $filename."
else
  echo "You do not have permissions on $filename."
fi

В этом скрипте:

  • -r проверяет, может ли текущий пользователь читать файл
  • -w проверяет, может ли текущий пользователь записывать в файл
  • Оператор && требует, чтобы оба условия были истинными
  • Оператор || требует, чтобы хотя бы одно условие было истинным

Сохраните файл (Ctrl+X, Y, Enter) и сделайте его исполняемым:

chmod +x permission_check.sh

Теперь изменим разрешения нашего тестового файла и посмотрим, как это повлияет на вывод нашего скрипта.

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

chmod 600 kings_gauntlet.txt
./permission_check.sh

Вывод:

You have read and write permissions on kings_gauntlet.txt.

Теперь изменим разрешения на только для чтения:

chmod 400 kings_gauntlet.txt
./permission_check.sh

Вывод:

You have limited permissions on kings_gauntlet.txt.

Наконец, удалим все разрешения:

chmod 000 kings_gauntlet.txt
./permission_check.sh

Вывод:

You do not have permissions on kings_gauntlet.txt.

Не забудьте восстановить разумные разрешения для файла:

chmod 600 kings_gauntlet.txt

Цепочка команд с использованием логических операторов

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

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

Попробуем простой пример:

mkdir -p test_dir && echo "Directory created successfully"

Команда mkdir -p создает директорию (и родительские директории при необходимости), а опция -p предотвращает ошибку, если директория уже существует. Команда echo выполняется только в том случае, если команда mkdir завершилась успешно.

Вывод:

Directory created successfully

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

ls nonexistent_file.txt || echo "File not found"

Поскольку файл "nonexistent_file.txt" не существует, команда ls завершается с ошибкой, и выполняется команда echo.

Вывод:

ls: cannot access 'nonexistent_file.txt': No such file or directory
File not found

Вы также можете комбинировать несколько команд с использованием этих операторов. Создайте скрипт с именем command_chain.sh:

nano command_chain.sh

Добавьте следующее содержимое:

#!/bin/bash

## This script demonstrates chaining commands with logical operators

echo "Starting command chain..."

## Create a directory and enter it only if creation succeeds
mkdir -p logic_test && cd logic_test && echo "Changed to new directory"

## Create a file and write to it only if creation succeeds
touch test_file.txt && echo "This is a test" > test_file.txt && echo "Created and wrote to file"

## Try to read a nonexistent file, or display an error message
cat nonexistent.txt || echo "Failed to read file"

## Return to the original directory
cd .. && echo "Returned to original directory"

echo "Command chain completed"

Сохраните файл (Ctrl+X, Y, Enter), сделайте его исполняемым и запустите:

chmod +x command_chain.sh
./command_chain.sh

Вывод:

Starting command chain...
Changed to new directory
Created and wrote to file
cat: nonexistent.txt: No such file or directory
Failed to read file
Returned to original directory
Command chain completed

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

Продвинутые операторы проверки файлов

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

Создадим скрипт, который демонстрирует эти операторы:

nano file_tests.sh

Добавьте следующее содержимое:

#!/bin/bash

## This script demonstrates various file testing operators in Linux

## Check if a file exists (as a file, directory, or other type)
file_to_check="treasure_map.txt"
directory_to_check="test_dir"

echo "--- Basic File Tests ---"
## -e checks if the file exists (any type)
if [[ -e "$file_to_check" ]]; then
  echo "$file_to_check exists"
else
  echo "$file_to_check does not exist"
fi

## -f checks if it's a regular file (not a directory or device)
if [[ -f "$file_to_check" ]]; then
  echo "$file_to_check is a regular file"
fi

## -d checks if it's a directory
if [[ -d "$directory_to_check" ]]; then
  echo "$directory_to_check is a directory"
else
  echo "$directory_to_check is not a directory"
fi

echo "--- File Size Tests ---"
## -s checks if file is not empty (has a size greater than zero)
if [[ -s "$file_to_check" ]]; then
  echo "$file_to_check is not empty"
else
  echo "$file_to_check is empty"
fi

echo "--- Permission Tests ---"
## -r, -w, -x check read, write, and execute permissions
if [[ -r "$file_to_check" ]]; then
  echo "$file_to_check is readable"
fi

if [[ -w "$file_to_check" ]]; then
  echo "$file_to_check is writable"
fi

if [[ -x "$file_to_check" ]]; then
  echo "$file_to_check is executable"
else
  echo "$file_to_check is not executable"
fi

echo "--- Combining Tests with Logical Operators ---"
## Combining tests with AND (&&)
if [[ -f "$file_to_check" ]] && [[ -r "$file_to_check" ]]; then
  echo "$file_to_check is a readable file"
fi

## Combining tests with OR (||)
if [[ -f "$file_to_check" ]] || [[ -d "$file_to_check" ]]; then
  echo "$file_to_check is either a file or a directory"
fi

Сохраните файл (Ctrl+X, Y, Enter), сделайте его исполняемым и запустите:

chmod +x file_tests.sh
./file_tests.sh

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

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

echo "This is a treasure map!" > treasure_map.txt
mkdir -p test_dir

Теперь запустим скрипт снова:

./file_tests.sh

Теперь, когда файл имеет содержимое и директория существует, вы должны увидеть другой вывод.

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

Резюме

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

  1. Вы изучили базовые логические операторы && (логическое И) и || (логическое ИЛИ) и научились использовать их в условных операторах.

  2. Вы использовали операторы проверки файлов, такие как -f, -r, -w и -x, для проверки существования файлов и их прав доступа.

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

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

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

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