Linux の論理演算

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Linux の論理演算実験(Lab)へようこそ。この実験では、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 シェルでは、論理演算子を使用してコマンドと条件を組み合わせるいくつかの方法が用意されています。このステップでは、最も一般的に使用される論理演算子である &&(論理積、AND)と ||(論理和、OR)について学びます。

まず、プロジェクトディレクトリに移動しましょう。

cd ~/project

この実験全体で使用するいくつかのテストファイルを作成しましょう。

touch treasure_map.txt shield.txt kings_gauntlet.txt

次に、基本的な論理演算を実証するスクリプトを作成しましょう。nano テキストエディタを使用して、logic_basics.sh という名前のファイルを作成します。

nano logic_basics.sh

このスクリプトでは、論理演算子を使用して 2 つのファイルが存在するかどうかをチェックします。以下のコードをエディタに入力または貼り付けます。

#!/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

&& 演算子は「論理積(AND)」を意味します。つまり、全体の条件が真になるためには、両方の条件が真でなければなりません。
-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

|| 演算子は「論理和(OR)」を意味します。つまり、いずれかの条件が真であれば、全体の条件は真になります。

ファイルを保存し(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 は、現在のユーザーがファイルを書き込み可能かどうかをテストします。
  • && 演算子は、両方の条件が真であることを要求します。
  • || 演算子は、少なくとも 1 つの条件が真であることを要求します。

ファイルを保存し(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 の論理演算子は、スクリプト内の条件文だけでなく、コマンドラインで直接コマンドを連鎖させるためにも使用できます。このステップでは、論理演算子を使ってコマンドを連鎖させる方法を学びます。

&& 演算子を使用すると、最初のコマンドが成功した場合(終了ステータスが 0 を返した場合)のみ、2 番目のコマンドを実行できます。これは、各ステップが前のステップの成功に依存する一連のコマンドを実行する際に便利です。

簡単な例を試してみましょう。

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

mkdir -p コマンドはディレクトリを作成し(必要に応じて親ディレクトリも作成します)、-p オプションはディレクトリが既に存在する場合のエラーを防ぎます。echo コマンドは、mkdir コマンドが成功した場合のみ実行されます。

出力:

Directory created successfully

次に、|| 演算子を試してみましょう。この演算子は、最初のコマンドが失敗した場合のみ 2 番目のコマンドを実行します。

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. 基本的な論理演算子 &&(AND)と ||(OR)について学び、条件文でそれらを使用する方法を習得しました。

  2. -f-r-w-x などのファイルテスト演算子を使用して、ファイルの存在とパーミッションを確認しました。

  3. 論理演算子を使用してコマンドを連鎖させ、前のコマンドの成否に依存する一連の操作を作成する練習を行いました。

  4. 様々なファイル演算子を探索し、論理演算子と組み合わせてより複雑な条件を作成する方法を学びました。

これらの論理演算は、Linux のスクリプト作成とコマンドライン使用における基本的なツールです。これらを使用することで、条件や前のコマンドの結果に基づいてさまざまな状況を処理できる高度なスクリプトを作成することができます。

論理演算を習得することで、Linux のシステム管理、自動化、およびスクリプト作成に必要なスキルを身につけました。これらのスキルは、Linux ユーザーまたは管理者としての道のりで大いに役立つでしょう。