<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Bash - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ エキスパートの手によるプログラミングチュートリアル記事を幅広く掲載。ウェブ開発、データサイエンス、DevOps、セキュリティ、開発者としてのキャリアなどについて学びましょう。 ]]>
        </description>
        <link>https://www.freecodecamp.org/japanese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Bash - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/japanese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 08:42:43 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/japanese/news/tag/bash/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ sudo apt-get update と upgrade の違いとは？ ]]>
                </title>
                <description>
                    <![CDATA[ sudo apt-get update と sudo apt-get upgrade は、Debian や Debian ベースのディストリビューションでパッケージを最新の状態に保つために利用できるコマンドです。 これらのコマンドは Linux 管理者や DevOps に携わる人にとってはよく使うものですが、コマンドラインを頻繁に使用しない人でも知っておくと役に立ちます。 この記事では、これらのコマンドの動作や使用方法、よくある質問などについて解説します。 sudo apt-get update と sudo apt-get upgrade の違いは何ですか？ 主な違いは、sudo apt-get update  はディストリビューションのソフトウェアリポジトリやあらかじめ設定されたサードパーティリポジトリから、最新バージョンのパッケージの一覧を取得することです。つまり、それぞれのパッケージや依存関係の最新バージョンを確認するだけで、更新内容を実際にダウンロードしたりインストールすることはありません。 一方、sudo apt-get upgrade は、システム上の古くなったパ ]]>
                </description>
                <link>https://www.freecodecamp.org/japanese/news/sudo-apt-get-update-vs-upgrade-what-is-the-difference/</link>
                <guid isPermaLink="false">67864ebfd7aa1e04405877c0</guid>
                
                    <category>
                        <![CDATA[ Bash ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ command ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Ubuntu ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ YUUSUKE OKAMOTO ]]>
                </dc:creator>
                <pubDate>Fri, 17 Jan 2025 23:04:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/japanese/news/content/images/2025/01/gabriel-heinzer-4Mw7nkQDByk-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文:</strong> <a href="https://www.freecodecamp.org/news/sudo-apt-get-update-vs-upgrade-what-is-the-difference/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">sudo apt-get update vs upgrade – What is the Difference?</a>
      </p><p><code>sudo apt-get update</code> と <code>sudo apt-get upgrade</code> は、Debian や Debian ベースのディストリビューションでパッケージを最新の状態に保つために利用できるコマンドです。</p><p>これらのコマンドは Linux 管理者や DevOps に携わる人にとってはよく使うものですが、コマンドラインを頻繁に使用しない人でも知っておくと役に立ちます。</p><p>この記事では、これらのコマンドの動作や使用方法、よくある質問などについて解説します。</p><h2 id="sudo-apt-get-update-sudo-apt-get-upgrade-"><code>sudo apt-get update</code> と <code>sudo apt-get upgrade</code> の違いは何ですか？</h2><p>主な違いは、<code>sudo apt-get update</code> はディストリビューションのソフトウェアリポジトリやあらかじめ設定されたサードパーティリポジトリから、最新バージョンのパッケージの一覧を取得することです。つまり、それぞれのパッケージや依存関係の最新バージョンを確認するだけで、更新内容を実際にダウンロードしたりインストールすることはありません。</p><p>一方、<code>sudo apt-get upgrade</code> は、システム上の古くなったパッケージや依存関係の更新バージョンをダウンロードおよびインストールします。しかし、<code>sudo apt-get upgrade</code> を実行しても、古くなったパッケージが即座にアップグレードされるわけではありません。変更内容を確認してから、アップグレードを実行するかどうか判断できます。</p><h2 id="sudo-apt-get-update-"><code>sudo apt-get update</code> コマンドの使い方</h2><p>Debian ベースの Linux ディストリビューション (Debian、Ubuntu、Linux Mint、Kali Linux、Raspberry Pi OS など) で、ターミナルウィンドウを開きます。</p><p>ディストリビューションおよびターミナルの開き方によって、名称は異なる場合があります。例えば、Ubuntu や Linux Mint では、デフォルトで Gnome Terminal が利用されますが、アプリケーションメニューでは単に「ターミナル」として表示されることもあります。</p><p>ターミナル上のコマンドラインで <code>sudo apt-get update</code> と入力し、管理者パスワードを入力して、Enter キーを押します。</p><p>もし更新する項目がある場合、次のような出力が表示されます:</p><pre><code>kris@pihole:~ $ sudo apt-get update
Hit:1 https://ftp.harukasan.org/raspbian/raspbian bullseye InRelease
Get:2 https://download.docker.com/linux/raspbian bullseye InRelease [26.7 kB]
Get:3 http://archive.raspberrypi.org/debian bullseye InRelease [23.7 kB]       
Get:4 http://packages.azlux.fr/debian buster InRelease [3,989 B]               
Get:5 http://archive.raspberrypi.org/debian bullseye/main armhf Packages [282 kB]
Get:6 http://packages.azlux.fr/debian buster/main armhf Packages [3,418 B]
Fetched 340 kB in 4s (94.8 kB/s)     
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
3 packages can be upgraded. Run 'apt list --upgradable' to see them.
</code></pre><p>アップグレード可能なパッケージを確認したい場合は、<code>apt list --upgradable</code> を実行します:</p><pre><code>kris@pihole:~ $ apt list --upgradable
Listing... Done
libcamera0/stable 0~git20220426+18e68a9b-1 armhf [upgradable from: 0~git20220303+e68e0f1e-1]
raspi-config/stable 20220425 all [upgradable from: 20220419]
rpi-eeprom/stable 13.13-1 armhf [upgradable from: 13.12-1]
</code></pre><p>しかし、ディストリビューションのソフトウェアリポジトリに新しいバージョンのパッケージや依存関係がない場合、次のような出力が表示されます:</p><pre><code>kris@pihole:~ $ sudo apt-get update
Get:1 https://download.docker.com/linux/raspbian bullseye InRelease [26.7 kB]
Hit:2 https://ftp.harukasan.org/raspbian/raspbian bullseye InRelease           
Hit:3 http://packages.azlux.fr/debian buster InRelease                         
Hit:4 http://archive.raspberrypi.org/debian bullseye InRelease
Fetched 26.7 kB in 3s (8,789 B/s)
Reading package lists... Done
</code></pre><p>ここには、アップグレード可能なパッケージや <code>apt list --upgradable</code> を実行するよう指示するメッセージがありません。</p><p>ただし、メッセージがないことは、システム上に更新が必要なソフトウェアがないことを意味するわけではなく、単に既に最新のパッケージリストを取得済みということです。<code>sudo apt-get update</code> を何度も実行した可能性もあります。</p><p>いつでも <code>apt list --upgradable</code> を再度実行して、アップグレード可能なものがあるかどうか確認できます。</p><p>また、より新しい <code>sudo apt update</code> コマンドを使用することもできます。このコマンドは常にアップグレード可能なパッケージの数を示すか、すべてが最新状態であるというメッセージを表示します。</p><p><code>apt</code> と <code>apt-get</code> の違いに関する詳細な情報は、<a href="#what-s-the-difference-between-apt-get-and-apt">以下のセクションで確認できます</a>。</p><h2 id="sudo-apt-get-upgrade-"><code>sudo apt-get upgrade</code> コマンドの使い方</h2><p><code>sudo apt-get update</code> コマンドを実行した後、同じターミナルウィンドウで、<code>sudo apt-get upgrade</code> と入力し、必要に応じてパスワードを入力して Enter を押します。</p><p>すると、次のような出力が表示されます:</p><pre><code>kris@pihole:~ $ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,616 kB of archives.
After this operation, 1,596 kB of additional disk space will be used.
Do you want to continue? [Y/n]
</code></pre><p>出力の最後に、アップグレードされるパッケージが表示されます。</p><pre><code>The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
</code></pre><p>取得する必要があるデータ量と、アップグレードされたパッケージがインストール後に使用するディスク容量が表示されます。</p><pre><code>Need to get 2,616 kB of archives.
After this operation, 1,596 kB of additional disk space will be used.
</code></pre><p>最後に、アップグレードを続けるかどうかの確認メッセージが表示されます:</p><pre><code>Do you want to continue? [Y/n]
</code></pre><p>アップグレードを続行するには、<code>y</code>、<code>Y</code>、または <code>yes</code> を入力し、終了する場合は、<code>n</code>、<code>N</code>、または <code>no</code> を入力します。</p><p>アップグレードを終了することを選んだ場合、以下のような出力が表示されます:</p><pre><code>kris@pihole:~ $ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,616 kB of archives.
After this operation, 1,596 kB of additional disk space will be used.
Do you want to continue? [Y/n] n
Abort.
</code></pre><p>アップグレードを続行することを選んだ場合の出力例:</p><pre><code>kris@pihole:~ $ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,616 kB of archives.
After this operation, 1,596 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.raspberrypi.org/debian bullseye/main armhf libcamera0 armhf 0~git20220426+18e68a9b-1 [548 kB]
Get:2 http://archive.raspberrypi.org/debian bullseye/main armhf raspi-config all 20220425 [30.3 kB]
Get:3 http://archive.raspberrypi.org/debian bullseye/main armhf rpi-eeprom armhf 13.13-1 [2,037 kB]
Fetched 2,616 kB in 3s (1,019 kB/s)   
Reading changelogs... Done
(Reading database ... 43496 files and directories currently installed.)
Preparing to unpack .../libcamera0_0~git20220426+18e68a9b-1_armhf.deb ...
Unpacking libcamera0:armhf (0~git20220426+18e68a9b-1) over (0~git20220303+e68e0f1e-1) ...
Preparing to unpack .../raspi-config_20220425_all.deb ...
Unpacking raspi-config (20220425) over (20220419) ...
Preparing to unpack .../rpi-eeprom_13.13-1_armhf.deb ...
Unpacking rpi-eeprom (13.13-1) over (13.12-1) ...
Setting up rpi-eeprom (13.13-1) ...
Setting up libcamera0:armhf (0~git20220426+18e68a9b-1) ...
Setting up raspi-config (20220425) ...
Processing triggers for man-db (2.9.4-2) ...
Processing triggers for libc-bin (2.31-13+rpt2+rpi1+deb11u2) ...
</code></pre><p>処理が完了すると、全ての古いパッケージと依存関係が更新されます。</p><p><code>sudo apt-get upgrade</code> コマンドの重要な点は、何も削除せずにアップグレードのみ行うことです。</p><p>例えば、アップグレードに新しい依存関係が必要な場合、<code>upgrade</code> コマンドは、新しい依存関係をダウンロードおよびインストールしますが、古い依存関係を削除することはありません。古い依存関係を削除するには、別のコマンドが必要です。新しいカーネルバージョンにアップグレードする際によく見られます。</p><p>アップグレード後に次のようなメッセージが表示された場合:</p><pre><code>The following packages were automatically installed and are no longer required:
  g++-8 gir1.2-mutter-4 libapache2-mod-php7.2 libcrystalhd3
Use 'sudo apt autoremove' to remove them.
</code></pre><p>提案通りに、<code>sudo apt autoremove</code> で不要なパッケージを削除することができます。</p><h2 id="sudo-apt-get-upgrade--1"><code>sudo apt-get upgrade</code> コマンドで追加のオプションを使用する方法</h2><p><code>sudo apt-get upgrade</code> コマンドには多くの追加のオプションまたはパラメータがありますが、その中でも注目すべきは <code>--dry-run</code> と <code>--yes</code> です。</p><h3 id="-dry-run-"><code>--dry-run</code> オプションの使用方法:</h3><p><code>--dry-run</code> (もしくは <code>-s</code> または <code>--simulate</code>) オプションは、アップグレード処理中に何が起こるかをシュミレーションしますが、システム上で何も変更しません:</p><pre><code>kris@pihole:~ $ sudo apt-get upgrade --dry-run
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Inst libcamera0 [0~git20220303+e68e0f1e-1] (0~git20220426+18e68a9b-1 Raspberry Pi Foundation:stable [armhf])
Inst raspi-config [20220331] (20220425 Raspberry Pi Foundation:stable [all])
Inst rpi-eeprom [13.12-1] (13.13-1 Raspberry Pi Foundation:stable [armhf])
Conf libcamera0 (0~git20220426+18e68a9b-1 Raspberry Pi Foundation:stable [armhf])
Conf raspi-config (20220425 Raspberry Pi Foundation:stable [all])
Conf rpi-eeprom (13.13-1 Raspberry Pi Foundation:stable [armhf])
</code></pre><p>繰り返しになりますが、Debian や Debian ベースのディストリビューションは非常に安定しています。一方で、このオプションは、アップグレード時の競合がないことを確認したい場合に便利です。</p><h3 id="-yes-"><code>--yes</code> オプションの使用方法:</h3><p><code>--yes</code> (または <code>-y</code> や <code>--assume-yes</code>) オプションは、安全であれば、全てのプロンプトに自動的に「はい」と回答します:</p><pre><code>kris@pihole:~ $ sudo apt-get upgrade --yes
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,616 kB of archives.
After this operation, 1,596 kB of additional disk space will be used.
Get:1 http://archive.raspberrypi.org/debian bullseye/main armhf libcamera0 armhf 0~git20220426+18e68a9b-1 [548 kB]
Get:2 http://archive.raspberrypi.org/debian bullseye/main armhf raspi-config all 20220425 [30.3 kB]
Get:3 http://archive.raspberrypi.org/debian bullseye/main armhf rpi-eeprom armhf 13.13-1 [2,037 kB]
...
Processing triggers for libc-bin (2.31-13+rpt2+rpi1+deb11u2) ...
</code></pre><p><code>Do you want to continue? [Y/n]</code> は省略され、すべてのパッケージがアップグレードされます。</p><h2 id="-">よくある質問</h2><h3 id="sudo-apt-get-"><code>sudo</code> と <code>apt-get</code> とは？</h3><p><code>sudo apt-get update</code> および <code>sudo apt-get upgrade</code> というコマンドは、それぞれ <code>sudo</code>、<code>apt-get</code>、そして、<code>update</code> または <code>upgrade</code> の 3 つで構成されています。</p><p><code>sudo</code> は、"superuser do" の略で、管理者権限でプログラムを実行するためのコマンドです。</p><p>例えば、システムの再起動には管理者権限が必要です。このため、ターミナルで <code>reboot</code> コマンドを実行すると、次のようなエラーメッセージが表示されるかもしれません。</p><pre><code>Failed to set wall message, ignoring: Interactive authentication required.
Failed to reboot system via logind: Interactive authentication required.
Failed to open initctl fifo: Permission denied
Failed to talk to init daemon.
</code></pre><p>しかし、<code>sudo reboot</code> コマンドを実行し、管理者パスワードを入力すると、<code>reboot</code> コマンドが管理者権限で実行され、すぐにシステムが再起動されます。</p><p><code>apt-get</code> は、Debian および Debian ベースのディストリビューションでパッケージをインストールおよび管理するためのコマンドラインツールです。</p><!--kg-card-begin: html--><h3 id="what-s-the-difference-between-apt-get-and-apt"><code>apt-get</code> と <code>apt</code> の違いは？</h3><!--kg-card-end: html--><p><code>apt</code> は、Debian および Debian ベースのディストリビューションでアプリケーションをインストールおよび管理するための最新のツールです。</p><p><code>apt</code> と <code>apt-get</code> は互換性があり、<code>sudo apt update</code> と <code>sudo apt-get update</code> は、どちらもシステムパッケージを更新します。</p><p>主な違いとしては、<code>apt</code> の方が入力が簡単で出力がわかりやすく、パッケージのインストール中のプログレスバーなどユーザーフレンドリーな機能を含んでいることです。</p><p>この記事の多くの例では <code>apt-get</code> を使用していますが、個人的には <code>apt</code> を使用することをお勧めします。</p><h3 id="sudo-apt-get-update-sudo-apt-get-upgrade--1"><code>sudo apt-get update</code> と <code>sudo apt-get upgrade</code> は安全ですか？</h3><p>はい、Debian および Debian ベースのディストリビューションは、非常に安定しており、<code>update</code> と <code>upgrade</code> コマンドは安全に使用できます。これは、パッケージや依存関係、そしてディストリビューション自体の大規模なアップデートが年に一度か二度しかリリースされないからです。</p><p>欠点としては、最新のパッケージを使用したい場合は、Arch Linux などの最先端ディストリビューションとは異なり、追加の手間がかかることがあります。PPA を通じてサードパーティのリポジトリを設定したり、Snap や Flatpak などの別のパッケージングシステムを使用したり、自分でコンパイルする必要があるかもしれません。</p><p>とはいえ、少し古いソフトウェアによる安定性を重視する価値は十分にあると考えています。</p><h3 id="sudo-apt-get-update-sudo-apt-get-upgrade--2"><code>sudo apt-get update</code> と <code>sudo apt-get upgrade</code> を連続して実行できますか？</h3><p><code>sudo apt-get update</code> を実行して完了を待ってから、<code>sudo apt-get upgrade</code> を実行するのは、面倒ではないかと考えるかもしれません。</p><p><code>sudo apt-get update</code> と <code>sudo apt-get upgrade</code> の両方が比較的速く実行されるとはいえ、指令をまとめて実行し、数分後に確認する方が楽なことがあります。</p><p><code>&amp;&amp;</code> 演算子を使用すると、次のようにコマンドを連続して実行できます。</p><pre><code>sudo apt-get update &amp;&amp; sudo apt-get upgrade
</code></pre><p><code>&amp;&amp;</code> 演算子の重要なポイントは、演算子の後のコマンドが実行されるのは、前のコマンドが成功した場合だけということです。</p><p>上記の例を使用すると、<code>sudo apt-get upgrade</code> は <code>sudo apt-get update</code> が成功した場合にのみ実行されます。例えば、パッケージリストの更新中にネットワークの問題が発生した場合には、<code>sudo apt-get update</code> がスキップされます。</p><h3 id="sudo-apt-get-dist-upgrade-sudo-apt-full-upgrade-"><code>sudo apt-get dist-upgrade</code> と <code>sudo apt full-upgrade</code> とは？これらは安全に使用できますか？</h3><p><a href="https://askubuntu.com/questions/770135/apt-full-upgrade-versus-apt-get-dist-upgrade">StackOverflow のスレッド</a>によれば、これらのコマンドは、内部的には同じことを行います。つまり、古くなったパッケージをアップグレードし、必要に応じて賢くパッケージを削除します。</p><p>基本的には、<code>sudo apt-get upgrade</code> と <code>sudo apt autoremove</code> のコマンドを組み合わせたようなものです。</p><p>これらのコマンドを実行することは、ほとんどの場合安全なはずです。</p><p>しかし、私を含め多くの人が、<code>sudo apt-get update</code> と <code>sudo apt-get upgrade</code> を使用することを推奨しています。変更される内容を確認する機会が増えますし、<code>upgrade</code> は、パッケージを削除しないため、システムへの影響が少なくなります。</p><h2 id="-thanks_for_reading-sh"><code>./thanks_for_reading.sh</code></h2><p><code>sudo apt-get update</code> と <code>sudo apt-get upgrade</code> の説明が役に立ったと感じたら、ぜひ友人にシェアしていただき、より多くの人に知識を広めてください。</p><p>また、<a href="https://twitter.com/kriskoishigawa">Twitter</a> で感想をお聞かせいただけると嬉しいです。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Bash スクリプトチュートリアル – 初心者向けの Linux シェルスクリプトとコマンドライン ]]>
                </title>
                <description>
                    <![CDATA[ Linux では、プロセスの自動化は shell スクリプトに大きく依存しています。shell スクリプトとは、一連のコマンドを含むファイルを作成し、まとめて実行できるようにすることを意味します。 この記事では、変数、コマンド、入力 / 出力、およびデバッグを含む bash スクリプトの基本から説明します。それぞれの例もあわせて見ていきます。 それでは始めましょう。🚀 目次  1. 事前準備  2. はじめに  * Bash スクリプトの定義  * Bash スクリプトの利点  * Bash shell とコマンドラインインターフェースの概要  3. Bash スクリプトの始め方  * コマンドラインから Bash コマンドを実行する方法  * Bash スクリプトの作成と実行方法  4. Bash スクリプトの基本  * ]]>
                </description>
                <link>https://www.freecodecamp.org/japanese/news/bash-scripting-tutorial-linux-shell-script-and-command-line-for-beginners/</link>
                <guid isPermaLink="false">6655a9337aebac04055b9be1</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Bash ]]>
                    </category>
                
                    <category>
                        <![CDATA[ command ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Charlotte Stone ]]>
                </dc:creator>
                <pubDate>Fri, 12 Jul 2024 15:57:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/japanese/news/content/images/2024/05/Copy-of-Cast-a-Function-in-SQL---Convert-Char-to-Int-SQL-Server-Example.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文:</strong> <a href="https://www.freecodecamp.org/news/bash-scripting-tutorial-linux-shell-script-and-command-line-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Bash Scripting Tutorial – Linux Shell Script and Command Line for Beginners</a>
      </p><p>Linux では、プロセスの自動化は shell スクリプトに大きく依存しています。shell スクリプトとは、一連のコマンドを含むファイルを作成し、まとめて実行できるようにすることを意味します。</p><p>この記事では、変数、コマンド、入力 / 出力、およびデバッグを含む bash スクリプトの基本から説明します。それぞれの例もあわせて見ていきます。</p><p>それでは始めましょう。🚀</p><h2 id="-">目次</h2><!--kg-card-begin: markdown--><ol>
<li><a href="#pre-requisites">事前準備</a></li>
<li><a href="#introduction">はじめに</a></li>
</ol>
<ul>
<li><a href="#definition-of-bash-scripting">Bash スクリプトの定義</a></li>
<li><a href="#advantages-of-bash-scripting">Bash スクリプトの利点</a></li>
<li><a href="#overview-of-bash-shell-and-command-line-interface">Bash shell とコマンドラインインターフェースの概要</a></li>
</ul>
<ol start="3">
<li><a href="#how-to-get-started-with-bash-scripting">Bash スクリプトの始め方</a></li>
</ol>
<ul>
<li><a href="#how-to-run-bash-commands-from-the-command-line">コマンドラインから Bash コマンドを実行する方法</a></li>
<li><a href="#how-to-create-and-execute-bash-scripts">Bash スクリプトの作成と実行方法</a></li>
</ul>
<ol start="4">
<li><a href="#bash-scripting-basics">Bash スクリプトの基本</a></li>
</ol>
<ul>
<li><a href="#comments-in-bash-scripting">Bash スクリプトでのコメント</a></li>
<li><a href="#variables-and-data-types-in-bash">Bash における変数とデータ型</a></li>
<li><a href="#input-and-output-in-bash-scripts">入力と出力に関する Bash スクリプト</a></li>
<li><a href="#basic-bash-commands-echo-read-etc-">基本的な Bash コマンド (echo、read など)</a></li>
<li><a href="#conditional-statements-if-else-">条件文 (if / else)</a></li>
</ul>
<ol start="5">
<li><a href="#looping-and-branching-in-bash">Bash におけるループと分岐</a></li>
</ol>
<ul>
<li><a href="#while-loop">While ループ</a></li>
<li><a href="#for-loop">For ループ</a></li>
<li><a href="#case-statements">Case 文</a></li>
</ul>
<ol start="6">
<li><a href="#how-to-schedule-scripts-using-cron">cron を使用したスクリプトのスケジュール設定方法</a></li>
<li><a href="#how-to-debug-and-troubleshoot-bash-scripts">Bash スクリプトのデバッグとトラブルシューティング方法</a></li>
<li><a href="#conclusion">結論</a></li>
</ol>
<ul>
<li><a href="#resources-for-learning-more-about-bash-scripting">Bash スクリプトに関するさらなる学習リソース</a></li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><h2 id="pre-requisites">事前準備</h2><!--kg-card-end: html--><p>このチュートリアルに従うには、次のアクセス権が必要です:</p><ul><li>コマンドラインにアクセスできる、実行可能な Linux のバージョン。</li></ul><p>Linux をインストールしていない場合や、まだ始めたばかりの場合は、<a href="https://replit.com/~">Replit</a> を介して簡単に Linux コマンドラインにアクセスできます。Replit はブラウザベースの IDE であり、数分で bash シェルにアクセスできます。</p><p>Windows システム上に Linux をインストールする方法として、WSL (Windows Subsystem for Linux) を使用することもできます。<a href="https://www.freecodecamp.org/news/how-to-install-wsl2-windows-subsystem-for-linux-2-on-windows-10/">そのためのチュートリアルはこちら</a>です。</p><!--kg-card-begin: html--><h2 id="introduction">はじめに</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="definition-of-bash-scripting">Bash スクリプトの定義</h3><!--kg-card-end: html--><p>Bash スクリプトとは、bash プログラムによって一行ずつ実行されるコマンドのシーケンスを含むファイルのことです。これにより、特定のディレクトリへの移動、フォルダの作成、コマンドラインを使用したプロセスの起動など、一連の操作を実行することができます。</p><p>これらのコマンドをスクリプトに保存することにより、スクリプトを実行するだけで、同じ手順を何度も繰り返すことができます。</p><!--kg-card-begin: html--><h3 id="advantages-of-bash-scripting">Bash スクリプトの利点</h3><!--kg-card-end: html--><p>Bash スクリプトは、システム管理タスクの自動化、システムリソースの管理、および Unix / Linux システムでのその他のルーチンタスクを実行するための強力で多用途なツールです。シェルスクリプトの利点には以下のものがあります:</p><ul><li><strong>自動化</strong>: シェルスクリプトは繰り返しのタスクやプロセスを自動化でき、手動実行によるエラーのリスクを減らしながら時間を節約できます。</li><li><strong>移植性</strong>: シェルスクリプトは Unix、Linux、macOS、さらにはエミュレーターや仮想マシンを使えば Windows でも実行可能です。</li><li><strong>柔軟性</strong>: シェルスクリプトはカスタマイズ性が非常に高く、特定の要件に合わせて簡単に修正できます。他のプログラミング言語やユーティリティと組み合わせて、より強力なスクリプトを作成することも可能です。</li><li><strong>アクセシビリティ</strong>: シェルスクリプトは簡単に書ける上、特別なツールやソフトウェアを必要としません。どのテキストエディタでも編集でき、大部分のオペレーティングシステムには標準でシェルインタープリターが搭載されています。</li><li><strong>統合性</strong>: シェルスクリプトはデータベース、ウェブサーバー、クラウドサービスなど、他のツールやアプリケーションと統合でき、より複雑な自動化やシステム管理タスクを実行することができます。</li><li><strong>デバッグ</strong>: シェルスクリプトはデバッグが容易で、ほとんどのシェルにはデバッグおよびエラーレポートツールが内蔵されており、問題を迅速に特定して修正するのに役立ちます。</li></ul><!--kg-card-begin: html--><h3 id="overview-of-bash-shell-and-command-line-interface">Bash シェルとコマンドラインインターフェースの概要</h3><!--kg-card-end: html--><p>「シェル」と「bash」という用語は同じように使われることがありますが、二つの間には微妙な違いがあります。</p><p>「シェル」という用語は、オペレーティングシステムと対話するためのコマンドラインインターフェースを提供するプログラムを指します。Bash (Bourne-Again SHell) は最も一般的に使用される Unix / Linux シェルの一つで、多くの Linux ディストリビューションでデフォルトのシェルとなっています。</p><p>シェルやコマンドラインインターフェースは次のような見た目をしています:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2024/06/image-135.png" class="kg-image" alt="image-135" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2024/06/image-135.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2024/06/image-135.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="532" loading="lazy"><figcaption>ユーザーからのコマンドを受け付け、出力を表示するシェル</figcaption></figure><p>上記の出力例では、<code>zaira@Zaira</code> がシェルプロンプトです。シェルが対話的に使用される場合、ユーザーからのコマンドを待っているときに <code>$</code> が表示されます。</p><p>シェルが root (管理権限を持つユーザー) として実行されている場合、プロンプトは <code>#</code> に変わります。スーパーユーザーのシェルプロンプトは次のような見た目です:</p><pre><code class="language-Bash">[root@host ~]#</code></pre><p>Bash はシェルの一種ですが、他にも Korn シェル (ksh)、C シェル (csh)、Z シェル (zsh) などのシェルがあります。各シェルにはそれぞれ独自の構文と機能がありますが、いずれもオペレーティングシステムと対話するためのコマンドラインインターフェースを提供するという共通の目的を持っています。</p><p><code>ps</code> コマンドを使用して、自分のシェルの種類を確認することができます:</p><pre><code class="language-Bash">ps</code></pre><p>私の環境では、以下のように出力結果されます:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2024/06/image-134.png" class="kg-image" alt="image-134" width="417" height="145" loading="lazy"><figcaption>シェルの種類の確認。私は Bash シェルを使用しています。</figcaption></figure><p>要約すると、「シェル (shell)」はコマンドラインインターフェースを提供する任意のプログラムを指す広義の用語であり、「Bash」は Unix / Linux システムで広く使用されている特定の種類のシェルです。</p><p>注意: このチュートリアルでは「bash」シェルを使用します。</p><!--kg-card-begin: html--><h2 id="how-to-get-started-with-bash-scripting">Bash スクリプトの始め方</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="how-to-run-bash-commands-from-the-command-line">コマンドラインから Bash コマンドを実行する方法</h3><!--kg-card-end: html--><p>前述の通り、シェルプロンプトは以下のように表示されます:</p><pre><code class="language-Bash">[username@host ~]$</code></pre><p><code>$</code> マークの後に任意のコマンドを入力し、その出力をターミナルで確認できます。</p><p>一般的に、コマンドは以下の構文に従います:</p><pre><code class="language-Bash">command [OPTIONS] arguments</code></pre><p>基本的な Bash コマンドについていくつか説明しながら、その出力を見てみましょう。一緒に試しながら進めてください :)</p><ul><li><code>date</code>: 現在の日付を表示します。</li></ul><pre><code class="language-Bash">zaira@Zaira:~/shell-tutorial$ date
Tue Mar 14 13:08:57 PKT 2023</code></pre><ul><li><code>pwd</code>: 現在の作業ディレクトリを表示します。</li></ul><pre><code class="language-Bash">zaira@Zaira:~/shell-tutorial$ pwd
/home/zaira/shell-tutorial</code></pre><ul><li><code>ls</code>: 現在のディレクトリの内容を一覧表示します。</li></ul><pre><code class="language-Bash">zaira@Zaira:~/shell-tutorial$ ls
check_plaindrome.sh  count_odd.sh  env  log  temp</code></pre><ul><li><code>echo</code>: テキスト文字列や変数の値をターミナルに表示します。</li></ul><pre><code class="language-Bash">zaira@Zaira:~/shell-tutorial$ echo "Hello bash"
Hello bash</code></pre><p>コマンドのマニュアルは <code>man</code> コマンドでいつでも参照できます。</p><p>例えば、<code>ls</code> のマニュアルは以下のように表示されます:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2024/06/image-138.png" class="kg-image" alt="image-138" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2024/06/image-138.png 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2024/06/image-138.png 1000w, https://www.freecodecamp.org/japanese/news/content/images/size/w1600/2024/06/image-138.png 1600w, https://www.freecodecamp.org/japanese/news/content/images/2024/06/image-138.png 1890w" sizes="(min-width: 720px) 720px" width="1890" height="969" loading="lazy"><figcaption><code>man</code> コマンドを使用すると、コマンドの詳細なオプションを確認できます。</figcaption></figure><!--kg-card-begin: html--><h3 id="how-to-create-and-execute-bash-scripts">Bash スクリプトの作成と実行方法</h3><!--kg-card-end: html--><h3 id="--1">スクリプトの命名規則</h3><p>命名規則によれば、Bash スクリプトは <code>.sh</code> で終わります。ただし、<code>sh</code> の拡張子なしでも Bash スクリプトは正常に実行できます。</p><h3 id="shebang-">Shebang の追加</h3><p>Bash スクリプトは「シバン」<code>shebang</code> で始まります。Shebang は、hash <code>#</code> と bang <code>!</code> に続いて bash シェルのパスが書かれたものです。これはスクリプトの最初の行に書かれます。Shebang はシェルに対して、このスクリプトを bash シェルで実行するよう指示します。Shebang は単に bash インタープリターの絶対パスです。</p><p>以下は shebang ステートメントの例です:</p><pre><code class="language-Bash">#!/bin/bash</code></pre><p>次のコマンドを使用して、お使いの bash シェルのパス (上記の例とは異なる場合があります) を見つけることができます:</p><pre><code class="language-Bash">which bash</code></pre><h3 id="-bash-">最初の Bash スクリプトを作成する</h3><p>これから作成するスクリプトでは、ユーザーにパスの入力を促します。そして結果として、そのパスの内容を一覧表示します。</p><p>まず、<code>vi</code> コマンドを使用して、<code>run_all.sh</code> という名前のファイルを作成してください。他の任意のエディタを使用しても構いません。</p><pre><code class="language-Bash">vi run_all.sh</code></pre><p>ファイルに以下のコマンドを追加して保存してください:</p><figure class="kg-card kg-code-card"><pre><code class="language-Bash">#!/bin/bash
echo "Today is " `date`

echo -e "\nenter the path to directory"
read the_path

echo -e "\n you path has the following files and folders: "
ls $the_path</code></pre><figcaption>ユーザーが指定したディレクトリの内容を表示するスクリプト</figcaption></figure><p>スクリプトを行ごとに詳しく見てみましょう。同じスクリプトを、行番号付きで以下に示します。</p><pre><code class="language-Bash">  1 #!/bin/bash
  2 echo "Today is " `date`
  3
  4 echo -e "\nenter the path to directory"
  5 read the_path
  6
  7 echo -e "\n you path has the following files and folders: "
  8 ls $the_path</code></pre><ul><li>1 行目: シバン (<code>#!/bin/bash</code>) は Bash シェルのパスを指します。</li><li>2 行目: <code>echo</code> コマンドはバッククォートで囲まれた <code>date</code> を使用して、現在の日付と時刻をターミナルに表示します。</li><li>4 行目: ユーザーに有効なパスを入力してもらいます。</li><li>5 行目: <code>read</code> コマンドは入力を読み取り、変数 <code>the_path</code> に格納します。</li><li>8 行目: <code>ls</code> コマンドは変数に格納されたパスを取り、現在のファイルやフォルダを表示します。</li></ul><h3 id="bash-">Bash スクリプトを実行する</h3><p>スクリプトを実行可能にするために、次のコマンドでユーザーに実行権限を付与します:</p><pre><code class="language-Bash">chmod u+x run_all.sh</code></pre><p>ここでは、</p><ul><li><code>chmod</code> は現在のユーザー <code>u</code> のファイルの所有権を変更します。</li><li><code>+x</code> は現在のユーザーに実行権限を追加します。これにより、ファイルの所有者であるユーザーがスクリプトを実行できるようになります。</li><li><code>run_all.sh</code> は実行可能にしたいファイルです。</li></ul><p>以下の方法でスクリプトを実行できます:</p><ul><li><code>sh run_all.sh</code></li><li><code>bash run_all.sh</code></li><li><code>./run_all.sh</code></li></ul><p>それでは実際に動作する様子を見てみましょう🚀</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2024/06/run-script-bash-2.gif" class="kg-image" alt="run-script-bash-2" width="927" height="411" loading="lazy"></figure><!--kg-card-begin: html--><h2 id="bash-scripting-basics">Bash スクリプトの基本</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="comments-in-bash-scripting">Bash スクリプトでのコメント</h3><!--kg-card-end: html--><p>Bash スクリプトのコメントは <code>#</code> から始まります。つまり、<code>#</code> で始まる行はコメントであり、インタープリターに無視されます。</p><p>コメントはコードのドキュメント化に非常に役立ち、他の人がコードを理解しやすくするためにも、コメントを追加するのは良い習慣です。</p><p>以下はコメントの例です:</p><pre><code class="language-bash"># This is an example comment
# Both of these lines will be ignored by the interpreter</code></pre><!--kg-card-begin: html--><h3 id="variables-and-data-types-in-bash">Bash における変数とデータ型</h3><!--kg-card-end: html--><p>変数を使用するとデータを保存できます。変数を使ってスクリプトのあらゆる場所でデータを読み取り、アクセスし、操作することができます。</p><p>Bash にはデータ型がありません。Bash では、変数は数値、個々の文字、または文字列を保存することができます。</p><p>Bash では、変数の値を以下のように使用および設定できます:</p><ol><li>直接値を割り当てる例:</li></ol><pre><code class="language-bash">country=Pakistan</code></pre><!--kg-card-begin: markdown--><ol start="2">
<li>コマンド置換を使用して、プログラムやコマンドの出力に基づいて値を割り当てる例。既存の変数の値にアクセスするには <code>$</code> が必要です。</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-code-card"><pre><code class="language-bash">same_country=$country</code></pre><figcaption><code>country</code> の値を新しい変数 <code>same_country</code> に割り当てる</figcaption></figure><p>変数の値にアクセスするには、変数名の頭に <code>$</code> を付け加えます。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">zaira@Zaira:~$ country=Pakistan
zaira@Zaira:~$ echo $country
Pakistan
zaira@Zaira:~$ new_country=$country
zaira@Zaira:~$ echo $new_country
Pakistan</code></pre><figcaption>変数に値を割り当てて値を表示する</figcaption></figure><h3 id="--2">変数の命名規則</h3><p>Bash スクリプティングにおける変数の命名規則は以下の通りです:</p><!--kg-card-begin: markdown--><ol>
<li>変数名は文字またはアンダースコア (<code>_</code>) で始める必要があります。</li>
<li>変数名には文字、数字、アンダースコア (<code>_</code>) を含めることができます。</li>
<li>変数名は大文字と小文字を区別します。</li>
<li>変数名にはスペースや特殊文字を含めることはできません。</li>
<li>変数の目的を反映した説明的な名前を使用します。</li>
<li><code>if</code>、<code>then</code>、<code>else</code>、<code>fi</code> などの予約キーワードを変数名として使用することは避けます。</li>
</ol>
<!--kg-card-end: markdown--><p>以下は Bash で有効な変数名の例です:</p><pre><code class="language-bash">name
count
_var
myVar
MY_VAR</code></pre><p>以下は Bash で無効な変数名の例です:</p><pre><code class="language-bash">2ndvar (variable name starts with a number)
my var (variable name contains a space)
my-var (variable name contains a hyphen)</code></pre><p>これらの命名規則に従うことは、Bash スクリプトをより読みやすく、メンテナンスしやすくするのに役立ちます。</p><!--kg-card-begin: markdown--><h3 id="input-and-output-in-bash-scripts">入力と出力に関する Bash スクリプト</h3><!--kg-card-end: markdown--><h3 id="--3">入力の収集</h3><p>このセクションでは、スクリプトに入力を提供するいくつかの方法について説明します。</p><ol><li>ユーザーの入力を読み取り、変数に格納する方法</li></ol><p><code>read</code> コマンドを使用してユーザーの入力を読み取ることができます。</p><pre><code class="language-bash">#!/bin/bash 

echo "What's your name?" 

read entered_name 

echo -e "\nWelcome to bash tutorial" $entered_name</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2024/07/name-sh.gif" class="kg-image" alt="name-sh" width="843" height="431" loading="lazy"></figure><!--kg-card-begin: markdown--><ol start="2">
<li>ファイルから読み取る方法</li>
</ol>
<!--kg-card-end: markdown--><p>このコードは、<code>input.txt</code> という名前のファイルから各行を読み取り、それをターミナルに出力します。while ループについては後ほど学びます。</p><pre><code class="language-bash">while read line
do
  echo $line
done &lt; input.txt
</code></pre><!--kg-card-begin: markdown--><ol start="3">
<li>コマンドライン引数を使う方法</li>
</ol>
<!--kg-card-end: markdown--><p>Bash スクリプトや関数では、<code>$1</code> は渡された最初の引数、<code>$2</code> は 2 番目の引数を表します。その後の数字も同様です。</p><p>下記のスクリプトは、コマンドライン引数として名前を受け取り、個別の挨拶メッセージを表示します。</p><pre><code class="language-bash">echo "Hello, $1!"
</code></pre><p>スクリプトに引数として <code>Zaira</code> を渡してみます。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">#!/bin/bash
echo "Hello, $1!"</code></pre><figcaption>スクリプト <code>greeting.sh</code> のコード</figcaption></figure><!--kg-card-begin: markdown--><p><strong>出力:</strong></p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2024/07/name-sh-1.gif" class="kg-image" alt="name-sh-1" width="883" height="455" loading="lazy"></figure><h3 id="--4">出力の表示</h3><p>ここでは、スクリプトから出力を受け取るいくつかの方法について説明します。</p><ol><li>ターミナルへの出力:</li></ol><pre><code class="language-bash">echo "Hello, World!"
</code></pre><p>これは、ターミナルに「Hello, World!」というテキストを表示します。</p><!--kg-card-begin: markdown--><ol start="2">
<li>ファイルへの書き込み:</li>
</ol>
<!--kg-card-end: markdown--><pre><code class="language-bash">echo "This is some text." &gt; output.txt</code></pre><p>これは、「This is some text.」というテキストを <code>output.txt</code> という名前のファイルに書き込みます。なお、<code>&gt;</code> 演算子はファイルに既に内容がある場合、それを上書きします。</p><!--kg-card-begin: markdown--><ol start="3">
<li>ファイルへの追記:</li>
</ol>
<!--kg-card-end: markdown--><pre><code class="language-bash">echo "More text." &gt;&gt; output.txt</code></pre><p>これは、「More text.」というテキストを <code>output.txt</code> ファイルの末尾に追記します。</p><!--kg-card-begin: markdown--><ol start="4">
<li>出力のリダイレクト:</li>
</ol>
<!--kg-card-end: markdown--><pre><code class="language-bash">ls &gt; files.txt</code></pre><p>これは、現在のディレクトリ内のファイルを一覧表示し、その出力を <code>files.txt</code> という名前のファイルに書き込みます。この方法で任意のコマンドの出力をファイルにリダイレクトできます。</p><!--kg-card-begin: html--><h3 id="basic-bash-commands-echo-read-etc-">基本的な Bash コマンド (echo、read など)</h3><!--kg-card-end: html--><p>以下は、最もよく使われる Bash コマンドのリストです:</p><!--kg-card-begin: markdown--><ol>
<li><code>cd</code>: ディレクトリを別の場所に変更します。</li>
<li><code>ls</code>: 現在のディレクトリの内容を一覧表示します。</li>
<li><code>mkdir</code>: 新しいディレクトリを作成します。</li>
<li><code>touch</code>: 新しいファイルを作成します。</li>
<li><code>rm</code>: ファイルまたはディレクトリを削除します。</li>
<li><code>cp</code>: ファイルまたはディレクトリをコピーします。</li>
<li><code>mv</code>: ファイルまたはディレクトリを移動または名前を変更します。</li>
<li><code>echo</code>: テキストをターミナルに表示します。</li>
<li><code>cat</code>: ファイルの内容を連結して表示します。</li>
<li><code>grep</code>: ファイル内のパターンを検索します。</li>
<li><code>chmod</code>: ファイルまたはディレクトリの権限を変更します。</li>
<li><code>sudo</code>: 管理者権限でコマンドを実行します。</li>
<li><code>df</code>: 使用可能なディスク容量を表示します。</li>
<li><code>history</code>: 以前に実行したコマンドのリストを表示します。</li>
<li><code>ps</code>: 実行中のプロセスに関する情報を表示します。</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><h3 id="conditional-statements-if-else-">条件文 (if / else)</h3><!--kg-card-end: html--><p>条件を評価してブール値 (true または false) を返す式は、条件と呼ばれます。条件を評価する方法には、<code>if</code>、<code>if-else</code>、<code>if-elif-else</code>、およびネストした条件分岐があります。</p><!--kg-card-begin: markdown--><p><strong>構文:</strong></p>
<!--kg-card-end: markdown--><figure class="kg-card kg-code-card"><pre><code class="language-bash">if [[ condition ]];
then
	statement
elif [[ condition ]]; then
	statement 
else
	do this by default
fi</code></pre><figcaption>Bash の条件文の構文</figcaption></figure><p>論理演算子、AND <code>-a</code> および OR <code>-o</code>、を使用して、より詳細な比較を行うことができます。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">if [ $a -gt 60 -a $b -lt 100 ]</code></pre><figcaption>この文は、「a が 60 より大きい」かつ「b が 100 未満」という両方の条件が <code>true</code> であるかどうかをチェックします。</figcaption></figure><p>ここでは、ユーザーが入力した数値が正、負、またはゼロのいずれかを判定するために、<code>if</code>、<code>if-else</code>、および <code>if-elif-else</code> 文を使用する Bash スクリプトの例を見てみましょう。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">#!/bin/bash

echo "Please enter a number: "
read num

if [ $num -gt 0 ]; then
  echo "$num is positive"
elif [ $num -lt 0 ]; then
  echo "$num is negative"
else
  echo "$num is zero"
fi
</code></pre><figcaption>数値が正、負、またはゼロのいずれかを判定するスクリプト</figcaption></figure><p>最初に、スクリプトはユーザーに数値の入力を促します。次に、その数値が 0 より大きいかどうかを <code>if</code> 文でチェックします。もし数値が 0 より大きければ、スクリプトは数値が正であると出力します。当てはまらない場合、スクリプトは次の <code>if-elif</code> 文に進みます。ここで、スクリプトは数値が 0 より小さいかどうかをチェックします。もし数値が 0 より小さければ、スクリプトは数値が負であると出力します。最後に、もし数値が 0 より大きくも小さくもなければ、スクリプトは <code>else</code> 文を使用して数値がゼロであることを出力します。</p><p>実際に動作を見てみましょう🚀</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2024/07/test-odd.gif" class="kg-image" alt="test-odd" width="913" height="518" loading="lazy"></figure><!--kg-card-begin: html--><h2 id="looping-and-branching-in-bash">Bash におけるループと分岐</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="while-loop">While ループ</h3><!--kg-card-end: html--><p>While ループは条件を確認し、条件が <code>true</code> の間ループします。ループの実行を制御するために、カウンター文を提供する必要があります。</p><p>以下の例では、<code>(( i += 1 ))</code> がカウンター文であり、<code>i</code> の値を増やします。このループはちょうど 10 回実行されます。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done</code></pre><figcaption>10 回繰り返す While ループ</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2024/07/image-187.png" class="kg-image" alt="image-187" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2024/07/image-187.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2024/07/image-187.png 630w" width="630" height="266" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="for-loop">For ループ</h3><!--kg-card-end: html--><p><code>for</code> ループも、<code>while</code> ループと同様に、特定の回数だけステートメントを実行することができます。それぞれのループは構文と使用方法が異なります。</p><p>以下の例では、ループは 5 回繰り返されます。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">#!/bin/bash

for i in {1..5}
do
    echo $i
done</code></pre><figcaption>5 回繰り返す For ループ</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2024/07/image-186.png" class="kg-image" alt="image-186" width="580" height="150" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="case-statements">Case 文</h3><!--kg-card-end: html--><p>Bash では、case 文を使用して、与えられた値をパターンのリストと比較し、最初にマッチしたパターンに基づいてコードブロックを実行することができます。Bash における case 文の構文は以下の通りです:</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">case expression in
    pattern1)
        # code to execute if expression matches pattern1
        ;;
    pattern2)
        # code to execute if expression matches pattern2
        ;;
    pattern3)
        # code to execute if expression matches pattern3
        ;;
    *)
        # code to execute if none of the above patterns match expression
        ;;
esac
</code></pre><figcaption>case 文の構文</figcaption></figure><p>ここでは、「expression」は比較したい値であり、「pattern1」、「pattern2」、「pattern3」などが比較対象にしたいパターンです。</p><p>二重のセミコロン ";;" は、各パターンに対して実行するコードブロックを区切ります。アスタリスク "*" はデフォルトのケースを表し、指定されたパターンのどれも一致しない場合に実行されます。</p><p>例を見てみましょう。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">fruit="apple"

case $fruit in
    "apple")
        echo "This is a red fruit."
        ;;
    "banana")
        echo "This is a yellow fruit."
        ;;
    "orange")
        echo "This is an orange fruit."
        ;;
    *)
        echo "Unknown fruit."
        ;;
esac
</code></pre><figcaption>case 文の例</figcaption></figure><p>この例では、「fruit」の値が「apple」であるため、最初のパターンが一致し、「This is a red fruit.」と出力するコードブロックが実行されます。もし "fruit" の値が代わりに "banana" であれば、2 番目のパターンが一致し、「This is a yellow fruit.」と出力するコードブロックが実行されます。そして、「fruit」の値が指定されたどのパターンにも一致しない場合は、デフォルトのケースが実行され、「Unknown fruit.」と出力されます。</p><!--kg-card-begin: html--><h2 id="how-to-schedule-scripts-using-cron">cron を使用したスクリプトのスケジュール設定方法</h2><!--kg-card-end: html--><p>Cron は、Unix 系オペレーティングシステムで利用可能なジョブスケジューリングの強力なユーティリティです。cron を設定することで、日次、週次、月次、または特定の時間ベースで自動ジョブを設定することができます。cron が提供する自動化機能は、Linux システム管理において重要な役割を果たします。</p><p>以下は cron をスケジュールするための構文です:</p><pre><code class="language-bash"># Cron job example
* * * * * sh /path/to/script.sh</code></pre><p>この <code>*</code> は、それぞれ分、時、日、月、曜日を表します。</p><p>以下は cron ジョブをスケジュールするいくつかの例です。</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>スケジュール</th>
<th>説明</th>
<th>例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0 0 * * *</code></td>
<td>毎日真夜中にスクリプトを実行する</td>
<td><code>0 0 * * * /path/to/script.sh</code></td>
</tr>
<tr>
<td><code>*/5 * * * *</code></td>
<td>5 分ごとにスクリプトを実行する</td>
<td><code>*/5 * * * * /path/to/script.sh</code></td>
</tr>
<tr>
<td><code>0 6 * * 1-5</code></td>
<td>月曜日から金曜日の朝 6 時にスクリプトを実行する</td>
<td><code>0 6 * * 1-5 /path/to/script.sh</code></td>
</tr>
<tr>
<td><code>0 0 1-7 * *</code></td>
<td>毎月最初の 7 日間にスクリプトを実行する</td>
<td><code>0 0 1-7 * * /path/to/script.sh</code></td>
</tr>
<tr>
<td><code>0 12 1 * *</code></td>
<td>毎月 1 日の正午にスクリプトを実行する</td>
<td><code>0 12 1 * * /path/to/script.sh</code></td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><h3 id="crontab-">crontab を使用する</h3><p><code>crontab</code> ユーティリティは、cron ジョブを追加および編集するために使用されます。</p><p><code>crontab -l</code> は特定のユーザーに予定されているスクリプトのリストを表示します。</p><p><code>crontab -e</code> を使用して cron を追加および編集できます。</p><p><a href="https://www.freecodecamp.org/news/cron-jobs-in-linux/">他の記事で cron ジョブについて詳しく読む</a>ことができます。</p><!--kg-card-begin: html--><h2 id="how-to-debug-and-troubleshoot-bash-scripts">Bash スクリプトのデバッグとトラブルシューティング方法</h2><!--kg-card-end: html--><p>デバッグとトラブルシューティングは、どんな Bash スクリプトの作成者にとっても重要なスキルです。Bash スクリプトは非常にパワフルですが、エラーや予期しない動作が発生することもあります。このセクションでは、Bash スクリプトのデバッグとトラブルシューティングのためのいくつかのヒントやテクニックについて説明します。</p><h3 id="set-x-"><code>set -x</code> オプションを設定する</h3><p>Bash スクリプトをデバッグするための最も有用なテクニックの 1 つは、スクリプトの先頭で <code>set -x</code> オプションを設定することです。このオプションを設定すると、Bash はデバッグモードが有効になり、実行する各コマンドの先頭に <code>+</code> 記号を付けて端末に出力します。これは、スクリプト内でどこでエラーが発生しているかを特定するのに非常に役立ちます。</p><pre><code class="language-bash">#!/bin/bash

set -x

# Your script goes here
</code></pre><h3 id="--5">終了コードを確認する</h3><p>Bash がエラーに遭遇すると、そのエラーの性質を示す終了コードが設定されます。直近で実行したコマンドの終了コードは、<code>$?</code> 変数を使用して確認できます。値が <code>0</code> の場合、成功を示し、それ以外の値はエラーを示します。</p><pre><code class="language-bash">#!/bin/bash

# Your script goes here

if [ $? -ne 0 ]; then
    echo "Error occurred."
fi
</code></pre><h3 id="echo-"><code>echo</code> 文を使用する</h3><p>Bash スクリプトをデバッグする別の有用なテクニックは、コード全体に <code>echo</code> 文を挿入することです。これにより、どこでエラーが発生しているかや変数に渡されている値を特定するのに役立ちます。</p><pre><code class="language-bash">#!/bin/bash

# Your script goes here

echo "Value of variable x is: $x"

# More code goes here
</code></pre><p><code>set -e</code> オプションを使用する</p><p>スクリプト内の任意のコマンドが失敗した場合にスクリプトを直ちに終了させたい場合は、<code>set -e</code> オプションを使用できます。このオプションにより、スクリプト内のどのコマンドが失敗しても Bash はエラーで終了し、スクリプト内のエラーを特定して修正することが容易になります。</p><pre><code class="language-bash">#!/bin/bash

set -e

# Your script goes here
</code></pre><h3 id="-cron-">ログを確認して cron のトラブルシューティングを行う</h3><p>ログファイルを使用して cron のトラブルシューティングを行うことができます。スケジュールされたすべてのジョブについて、ログが保持されています。特定のジョブが意図通りに実行されたかどうか、ログを確認して検証することができます。</p><p>Ubuntu や Debian の場合、<code>cron</code> ログは次の場所にあります:</p><pre><code class="language-bash">/var/log/syslog</code></pre><p>他のディストリビューションでは場所が異なる場合があります。</p><p>cron ジョブのログファイルは次のようになっているでしょう:</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">2022-03-11 00:00:01 Task started
2022-03-11 00:00:02 Running script /path/to/script.sh
2022-03-11 00:00:03 Script completed successfully
2022-03-11 00:05:01 Task started
2022-03-11 00:05:02 Running script /path/to/script.sh
2022-03-11 00:05:03 Error: unable to connect to database
2022-03-11 00:05:03 Script exited with error code 1
2022-03-11 00:10:01 Task started
2022-03-11 00:10:02 Running script /path/to/script.sh
2022-03-11 00:10:03 Script completed successfully</code></pre><figcaption>cron ログ</figcaption></figure><!--kg-card-begin: html--><h2 id="conclusion">結論</h2><!--kg-card-end: html--><p>この記事では、まずターミナルへのアクセス方法といくつかの基本的な Bash コマンドの実行方法を説明しました。また、Bash シェルの概要についても学びました。ループや条件分岐を使用したコードの分岐についても簡単に見てきました。最後に、cron を使用したスクリプトの自動化とそのトラブルシューティング手法についても述べました。</p><!--kg-card-begin: html--><h3 id="resources-for-learning-more-about-bash-scripting">Bash スクリプトに関するさらなる学習リソース</h3><!--kg-card-end: html--><p>Bash スクリプティングの世界をさらに深く掘り下げたい場合は、freeCodeCamp による Linux に関する 6 時間の動画講座をお勧めします。</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/sWbUDq4S6Y8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Introduction to Linux – Full Course for Beginners" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p>このチュートリアルで学んだ中で一番好きなことは何ですか？また、この<a href="https://zaira_.bio.link/">プラットフォーム</a>で私とつながることもできます。📧</p><p>次のチュートリアルでお会いしましょう。楽しいコーディングを😁</p><p>バナー画像のクレジット: <a href="https://www.freepik.com/free-vector/hand-drawn-flat-design-devops-illustration_25726540.htm#query=programmer%20linux&amp;position=4&amp;from_view=search&amp;track=ais">Freepik</a> による画像</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Bash の配列 - Bash スクリプトで文字列の配列を宣言する方法 ]]>
                </title>
                <description>
                    <![CDATA[ Bash スクリプトは、コマンドラインのタスクを自動化できる便利な方法です。 Bash を使用すれば、他のスクリプト言語やプログラミング言語と同じようなことがたくさんできます。変数の作成と使用、ループの実行、条件論理の使用、配列へのデータの格納が可能です。 機能をよく知っていても、Bash の構文は扱いにくいものです。この記事では、配列の宣言方法と、それをコード内で使用する方法について学びます。 Bash で配列を宣言する方法 Bash で配列を宣言するのは簡単ですが、構文に注意してください。他の言語でのプログラミングに慣れていると、見慣れたコードに見えるかもしれません。しかし、見逃しがちな微妙な違いがあります。 配列の宣言は、以下の手順で行います。  1. 配列に名前をつけます。  2. その変数名の後にイコール記号を付けます。記号の周りにはスペースを入れてはいけません。  3. 配列を丸括弧で囲みます。(JavaScript のような角括弧は使いません)  4. 文字列を引用符で囲み、間にカンマを入れずに入力します。 配列の宣言は以下のようになります。 myArray ]]>
                </description>
                <link>https://www.freecodecamp.org/japanese/news/bash-array-how-to-declare-an-array-of-strings-in-a-bash-script/</link>
                <guid isPermaLink="false">63ba8a2e1a000106267c9401</guid>
                
                    <category>
                        <![CDATA[ Bash ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mell ]]>
                </dc:creator>
                <pubDate>Mon, 09 Jan 2023 23:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/japanese/news/content/images/2023/01/pexels-belle-co-1000445.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文:</strong> <a href="https://www.freecodecamp.org/news/bash-array-how-to-declare-an-array-of-strings-in-a-bash-script/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Bash Array – How to Declare an Array of Strings in a Bash Script</a>
      </p><p>Bash スクリプトは、コマンドラインのタスクを自動化できる便利な方法です。</p><p>Bash を使用すれば、他のスクリプト言語やプログラミング言語と同じようなことがたくさんできます。変数の作成と使用、ループの実行、条件論理の使用、配列へのデータの格納が可能です。</p><p>機能をよく知っていても、Bash の構文は扱いにくいものです。この記事では、配列の宣言方法と、それをコード内で使用する方法について学びます。</p><h2 id="bash-">Bash で配列を宣言する方法</h2><p>Bash で配列を宣言するのは簡単ですが、構文に注意してください。他の言語でのプログラミングに慣れていると、見慣れたコードに見えるかもしれません。しかし、見逃しがちな微妙な違いがあります。</p><p>配列の宣言は、以下の手順で行います。</p><ol><li>配列に名前をつけます。</li><li>その変数名の後にイコール記号を付けます。記号の周りにはスペースを<em>入れてはいけません</em>。</li><li>配列を<em>丸括弧</em>で囲みます。(JavaScript のような角括弧は使いません)</li><li>文字列を引用符で囲み、間に<em>カンマを入れず</em>に入力します。</li></ol><p>配列の宣言は以下のようになります。</p><pre><code class="language-sh">myArray=("cat" "dog" "mouse" "frog")</code></pre><p>これだけです！とてもシンプルです。</p><h2 id="bash--1">Bash で配列にアクセスする方法</h2><p>配列をループする方法には 2 種類あります。要素そのものをループさせるか、インデックスをループさせます。</p><h3 id="-">配列の要素をループする方法</h3><p>配列の要素をループするには、次のようなコードになります。</p><pre><code class="language-sh">for str in ${myArray[@]}; do
  echo $str
done</code></pre><p>簡単に説明すると、これは JavaScript で <code>forEach</code> を使うようなものです。配列 (myArray)の中の各文字列 (str) に対して、その文字列をプリントします。</p><p>このループの出力は以下のようになります。</p><pre><code>cat
dog
mouse
frog</code></pre><p><strong>注意: </strong>角括弧内の <code>@</code> 記号は、配列の<em>全要素</em>をループしていることを表しています。もし、これを省いて <code>for str in ${myArray}</code> &nbsp;と書くと、配列の最初の文字列だけが表示されます。</p><h3 id="--1">配列のインデックスをループする方法</h3><p>あるいは、配列のインデックスをループできます。これは JavaScript の <code>for</code> &nbsp;ループのようなもので、各要素のインデックスにアクセスしたい場合に便利です。</p><p>この方法を使用するには、以下のようなコードが必要です。</p><pre><code class="language-sh">for i in ${!myArray[@]}; do
  echo "element $i is ${myArray[$i]}"
done</code></pre><p>出力は以下のようになります。</p><pre><code>element 0 is cat
element 1 is dog
element 2 is mouse
element 3 is frog</code></pre><p><strong>注意: </strong>変数 <code>myArray</code> の先頭にある <code>!</code> は、要素そのものではなく、配列の<em>インデックス</em>にアクセスしていることを示しています。これは、<code>!</code> が否定を示すのに慣れていると混乱することがあるので、十分注意してください。</p><p><strong>注意2: </strong>Bash では通常、変数には波括弧が不要ですが、配列には必要です。つまり、配列を参照するときは <code>${myArray}</code> という構文になります。しかし、文字列や数値を参照するときは単に <code>$i</code> というドル記号を使用するだけです。</p><h2 id="--2"><strong>まとめ</strong></h2><p>Bash スクリプトはコマンドラインの動作を自動化するのに便利です。そして、配列は複数のデータを格納するために使用できる素晴らしいツールです。</p><p>宣言して使用することは難しくありませんが、他の言語とは異なるので、間違えないように細心の注意を払いましょう。</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
