「あれ…?linux cat ってファイルの中身を見るだけのコマンドじゃないの!?」
「linux echo って、オウム返しするだけで何が嬉しいわけ…?」
Linuxサーバーを操作していると、必ず「テキスト処理」の壁にぶつかっちゃいますよね。
もしかして、「ログファイルから特定の部分だけ抜き出したいのに、どうすればいいの…?」って悩んでいませんか…?
「コマンドのエラーメッセージが画面を埋め尽くすのを止めたい!」
「スクリプトを実行したら command not found って出るけど、エラーだけファイルに保存したい… linux 2>&1 っていう暗号みたいなのは一体何なの!?」
わかります、わかります!私も全く同じ経験があります。
やりたいことがぜんぜんできなくて、「もしかして、Linuxって超むずかしい…?」「Windowsのメモ帳みたいにカンタンにできないの…?」って、もうパニックになっちゃいますよね😥
でも、大丈夫です!
その焦る気持ち、よーくわかります。でも、Linuxの本当のすごさは、ここからなんです!
LinuxやUNIX系OSの強力さの源泉は、実は「すべてはテキストである」っていう思想と、そのテキストを自在に操るための「小さなコマンドの連携」にあります。
cat や echo は、その最も基本的で、最も重要な入口なんですよ😲
この記事は、そんな「テキスト処理、わけわかんない!」地獄に陥ってしまったあなたを救うための、安全な対処法をステップバイステップで徹底的に解説する「完全ガイド」です🕵️♀️✨
「linux echo」「linux cat」の本当の使い方から、「linux リダイレクト (>, >>)」「linux 2>&1 の暗号解読」「linux cut での切り出し」、さらにはシェルスクリプトの基礎となる「linux if」「linux ワイルドカード」「linux 引数」「linux 配列」まで。
私と一緒に、一つずつ冷静に確認していきましょうね🥰
linux echo コマンド – シェルスクリプトの「目」となる基本出力
echo コマンドは、引数として与えられた文字列を「標準出力」(デフォルトではターミナルの画面ですね)にそのまま表示する、すっごくシンプルなコマンドです。
[user@server ~]$ echo "Hello, Linux World!" Hello, Linux World!
「ただオウム返しするだけで、何が便利なの?」って思うかもしれませんが、echo はシェルスクリプトにおいて「目」の役割を果たしてくれる、超重要なコマンドなんです。
- 変数の内容確認: スクリプトが正しく動作しているか、変数($VAR)に期待通りの値が入っているかを確認するために使います。
- ログの出力: スクリプトの実行状況をファイルに記録(リダイレクトと併用)するために使います。
- ユーザーへの指示: スクリプトの利用者に、次に行うべき操作を知らせるために使います。
echo の主要なオプション
echo にはたくさんのオプションがありますけど、絶対に覚えておくべきなのは以下の2つです!
-n (改行しない)
デフォルトでは、echo は文字列の最後に自動的に改行を追加しちゃいます。
-n オプションは、この改行をストップさせます。
[user@server ~]$ echo -n "Password: " Password: [user@server ~]$ <-- 改行されずにプロンプトが続いてますね!
こんな風に、ユーザーからの入力を促すプロンプトを表示する際によく使われますよ。
2. -e (エスケープシーケンスを有効にする)
-e オプションは、文字列の中の特別な「エスケープシーケンス」(\ で始まる特殊文字)を解釈して、特別な動作をさせます。
- \n : 改行
- \t : タブ
- \c : これ以降の出力をキャンセルして、改行もしない(-n と似た効果です)
[user@server ~]$ echo -e "Line 1\nLine 2\tTabbed" Line 1 Line 2 Tabbed
echo の動作(-e や -n の解釈)は、お使いのシェル(Bash, Zshなど)や環境によってビミョーに異なる場合があるんです…。
より確実で高機能な出力をしたい場合は、printf コマンド(C言語ライクな書式指定ができるコマンド)の使用が推奨されることも、頭の片隅に覚えておくと良いでしょう。
echo とクォーテーション:「”」「’」「“」
echo を使う上で、“(ダブルクォート)と ‘(シングルクォート)の違いを理解することは、すっっっごく重要です!
これは echo だけじゃなくて、Linuxシェル全体の超大事なルールなんですよ。
- ” (ダブルクォート)
この中で使われた変数($VAR とか)や特殊文字(バッククォート `)は、展開(解釈)されます!
変数の中身を表示したい場合は、こちらを使います。 - ‘ (シングルクォート)
この中で使われた文字は、ぜーんぶが単なる「文字列」として扱われます。
変数($VAR)も、ドル記号を含めたただの文字列 $ V A R になっちゃいます。 - ` (バッククォート) または $(…)
これはクォーテーションとはちょっと違って、「コマンド置換」って呼ばれます。
この中で実行されたコマンドの結果(標準出力)が、その場に文字列として埋め込まれるんです!
(今どきは、ネスト(入れ子)ができる $(…) の方が推奨されてますよ)
実行例
[user@server ~]$ VAR="Linux" [user@server ~]$ DATE=$(date) # 現在の日時を DATE 変数に格納
1. ダブルクォート(変数が展開される)
[user@server ~]$ echo "Hello, $VAR! Today is $DATE" Hello, Linux! Today is 2025年 11月 13日 木曜日 09時52分19秒 JST
2. シングルクォート(変数が展開されない)
[user@server ~]$ echo 'Hello, $VAR! Today is $DATE' Hello, $VAR! Today is $DATE
3. コマンド置換
[user@server ~]$ echo "Current directory is $(pwd)" Current directory is /home/user
「linux echo」 は、こんな風にシェル(Bashとか)の変数展開やコマンド置換と組み合わせて使うことで、真価を発揮するコマンドなんですね!
linux cat コマンド – ファイルの「表示」と「連結」
「linux cat」 は、Linuxを使い始めた人が最初に覚えるコマンドの一つでしょうね。
多くの人は cat を「ファイルの中身を表示するコマンド」として覚えますけど、それは cat の機能の半分でしかありません。
cat の本当の名前は「concatenate」=「連結する」っていう意味なんです!
この「連結する」っていう本来の意味を理解することが、cat とリダイレクトを使いこなす鍵になりますよ。
用途1:ファイルの中身を(すべて)表示する
cat の最も基本的な使い方です。
引数に指定したファイルの中身を、標準出力(画面)に表示します。
[user@server ~]$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain ::1 localhost localhost.localdomain
【プロの警告】巨大なログファイルで cat を使ってはいけない
ここで初心者がやりがちな(そして私もやらかした)ミスが、巨大なログファイル(数GBにもなる!)に対して cat を実行しちゃうことです。
cat access.log
cat はファイルの中身を最初から最後まで、ぜーんぶ画面に出力しようとします。
だから、ターミナルの画面がものすごい勢いで流れちゃって、操作不能(あるいはすっごく重い状態)になっちゃうんです😥
巨大なファイルの中身を確認したい場合は、cat じゃなくて、ページャ(1画面ずつ表示する)機能を持つ less コマンドや、ファイルの末尾だけを表示する tail コマンドを使いましょうね!
- less access.log (1画面ずつ表示。q で終了できます)
- tail access.log (末尾の10行を表示)
- tail -f access.log (ログをリアルタイムで監視!超便利!)
用途2:複数のファイルを「連結」する(cat の本領)
cat の本来の機能は、複数のファイルを指定して、それらを連結した結果を標準出力(画面)に送ることです。
[user@server ~]$ cat intro.txt body.txt outro.txt (intro.txtの中身) (body.txtの中身) (outro.txtの中身)
画面上に、3つのファイルがこの順番でぜんぶ連結されて表示されます。
そして、この「標準出力に出す」っていう特性は、次の「リダイレクト」と組み合わせることで、爆発的な力を発揮するんですよ!
用途3:ファイルを作成・上書き・追記する(リダイレクトとの併用)
cat の連結機能と、後で詳しく解説するリダイレクト(> や >>)を組み合わせることで、ファイル操作の基本がほぼぜんぶできちゃいます。
ファイルの連結(linux cat + >)
cat [ファイル群] > [新しいファイル]
# intro.txt, body.txt, outro.txt を連結して、complete.txt を作成(上書き) [user@server ~]$ cat intro.txt body.txt outro.txt > complete.txt
2. ファイルのコピー(linux cat + >)
cat の引数を一つだけにすれば、それは「ファイルのコピー」とまったく同じ動作になります。
cat [コピー元] > [コピー先]
[user@server ~]$ cat original.txt > copy.txt
(cp original.txt copy.txt とほぼ同じですが、cp の方がメタ情報(パーミッションとか)を引き継ぐので、普通はコピーには cp を使いますよ)
3. ファイルの追記(linux cat + >>)
>>(追記リダイレクト)を使えば、既存のファイルの末尾に、別のファイルの内容を連結(追加)できます。
cat [追加したいファイル] >> [追記先のファイル]
# all_logs.log の末尾に、今日のログ (today.log) を追加する [user@server ~]$ cat today.log >> all_logs.log
4. 簡易的なファイル作成(cat + >)
cat は、引数にファイルが指定されないと、「標準入力」(デフォルトではキーボード)からの入力を待つ状態になります。
これをうまく利用して、簡易的なテキストエディタみたいにファイルを作成できちゃいます。
[user@server ~]$ cat > newfile.txt This is line 1. This is line 2. (ここで Ctrl+D を押す) [user@server ~]$
[user@server ~]$ cat newfile.txt This is line 1. This is line 2.
cat > … を実行すると入力待ち状態になって、入力した内容がそのままファイルに書き込まれます。
Ctrl+D を押すと、「入力終了(EOF)」の合図が送られて、ファイルが保存されてコマンドが終了します。
cat の便利なオプション
- -n (
--number)
すべての行(空行も含む)に行番号を付けて表示します。 - -b (
--number-nonblank)
空行を除いた、中身のある行だけに行番号を付けます。
[user@server ~]$ cat -n sample.txt 1 Line 1 2
3 Line 3
[user@server ~]$ cat -b sample.txt 1 Line 1
2 Line 3</code></pre>
【最重要】linux リダイレクト - 「流れ」を操るシェルの心臓部
echo や cat の説明で、すでに > や >> が登場しましたよね。
これらは「リダイレクト(Redirect = 向きを変える)」って呼ばれる、Linuxシェルの最も強力で、最も重要な機能なんです!
リダイレクトを理解するには、まずLinux(やUNIX)が持っている「3つの標準ストリーム(データの通り道)」を理解する必要があります。
1. 標準入力 (stdin) - ファイルディスクリプタ番号 0
コマンドがデータを受け取るための、デフォルトの「入力口」です。
通常はキーボードに接続されています。
2. 標準出力 (stdout) - ファイルディスクリプタ番号 1
コマンドが「正常な実行結果」を出力するための、デフォルトの「出力口」です。
通常はターミナルの画面に接続されています。
echo "Hello" の Hello はここに出力されます。
3. 標準エラー出力 (stderr) - ファイルディスクリプタ番号 2
コマンドが「エラーメッセージ」や「警告」を出力するための、もう一つの「出力口」です。
通常はターミナルの画面に接続されています。
ls /no/such/file の「ファイルがありません」っていうエラーはここに出力されます。
「え、なんで出力口が2つ(1 と 2)もあるの?」って思いますよね。
それは、「正常な結果(データ)」と「エラーメッセージ」を区別するためなんです!
もし出力口が一つしかなかったら、コマンドの実行結果をファイルに保存(command > result.txt)したときに、成功したデータとエラーメッセージがファイル内でごちゃまぜになっちゃって、後で処理するのがすっごく大変になっちゃいます。
リダイレクトっていうのは、これら3つのストリーム(通り道)の「接続先」を、キーボードや画面からファイルなんかに変更する操作のことを指すんです。
標準出力(1)のリダイレクト(> と >>)
標準出力(1)の行き先を変更します。
1> や 1>> って書くのが正式ですけど、1 は省略できちゃいます。
▼ > (上書き)
[コマンド] > [ファイル名]
コマンドの実行結果(標準出力)を、指定したファイルに上書き保存します。
ファイルが存在しない場合は新しく作られて、もし存在していたら中身がぜんぶ消えちゃうので、すっごく注意してください!(危険!)
# /etc/passwd の内容を user_list.txt に「上書き」保存 cat /etc/passwd > user_list.txt
▼ >> (追記)
[コマンド] >> [ファイル名]
コマンドの実行結果(標準出力)を、指定したファイルの末尾に追記します。
ファイルが存在しない場合は新しく作られます。こちらの方が安全な場合が多いですね!
# log.txt の末尾に、現在の時刻を「追記」 date >> log.txt
標準エラー出力(2)のリダイレクト(2> と 2>>)
標準エラー出力(2)の行き先を変更します。
こっちは 2 を省略できません!
▼ 2> (上書き)
[コマンド] 2> [エラーログファイル名]
コマンドのエラーメッセージ(標準エラー出力)だけを、指定したファイルに上書き保存します。
正常な結果(標準出力)は、通常通り画面に表示されます。
# 存在しないファイルを探す(エラーが出る) [user@server ~]$ find / -name "very_rare_file.txt" 2> error.log find: ‘/proc/1234/...’: 許可がありません find: ‘/run/user/1000/...’: 許可がありません ...(これらの正常な結果は画面に出る)
[user@server ~]$ cat error.log (「許可がありません」などのエラーメッセージだけがファイルに保存されてる!)
▼ 2>> (追記)
[コマンド] 2>> [エラーログファイル名]
エラーメッセージを、指定したファイルの末尾に追記します。
【超重要】linux 2>&1 の完全解説
ついに「暗号」の解読タイムです!
「正常な出力(1) も エラー出力(2) も、両方まとめて一つのファイルに保存したい」っていうケースは、すっごくよくあります(特にcronとかでスクリプトを自動実行する時)。
このときに使うのが「linux 2>&1」なんです。
構文:
[コマンド] > [ログファイル] 2>&1
例:
./my_script.sh > script_all.log 2>&1
この 2>&1 は、「2(標準エラー出力)の行き先を、&1(標準出力(1)の現在の行き先)と『同じ場所』にする」っていう意味の、シェルの特別な記法なんです。
このコマンドの実行順序は、こうなってます。
1. シェルが > を解釈:「./my_script.sh の標準出力(1)の行き先を、画面から script_all.log(ファイル)に変更する」
2. シェルが 2>&1 を解釈:「./my_script.sh の標準エラー出力(2)の行き先を、標準出力(1)の現在の行き先(つまり、script_all.log)と同じにする」
3. 結果:my_script.sh が出力する「正常な結果(1)」も「エラー(2)」も、両方とも script_all.log に書き込まれます!やったね!
【上級】順番の重要性:2>&1 > log.txt ではダメな理由
もし順番を間違えて command 2>&1 > log.txt って書いちゃうと、期待通りに動作しません😥
1. シェルが 2>&1 を解釈:「標準エラー出力(2)の行き先を、標準出力(1)の現在の行き先(つまり、画面)と同じにする」
2. シェルが > log.txt を解釈:「標準出力(1)の行き先を、画面から log.txt(ファイル)に変更する」
3. 結果:正常な結果(1)は log.txt に保存されますけど、エラー(2)は(ステップ1で設定された)画面に出力されちゃいます…
必ず > log.txt 2>&1 の順番で書く!って覚えてくださいね。
linux リダイレクト の応用: /dev/null
/dev/null は、Linuxシステムに存在する特殊なファイルで、「ブラックホール」みたいなものです。
/dev/null に書き込まれたデータは、すべてが即座に消滅して、どこにも保存されません。
これを利用して、いらない出力を「捨てる」ことができるんです。
command > /dev/null
正常な結果(1)だけを捨てる(エラー(2)は画面に出る)。 command 2> /dev/null
エラー(2)だけを捨てる(正常な結果(1)は画面に出る)。 command > /dev/null 2>&1
(最強の「黙らせる」コマンド)
正常な結果(1)を /dev/null(ブラックホール)に捨てて、さらにエラー(2)も &1(ブラックホール)に捨てる。
コマンドの一切の出力(正常・エラー問わず)を画面に表示させたくない場合に使います。cronで定期実行するスクリプトとかで大活躍しますよ!
標準入力のリダイレクト(< と <<)
出力(>)だけじゃなくて、入力(0)の接続先も変更できます。
▼ < (ファイルを入力にする)
[コマンド] < [入力ファイル]
キーボードの代わりに、指定したファイルの内容をコマンドの標準入力(0)に流し込みます。
# cat は標準入力を待つ -> file.txt が入力される -> cat は受け取ったものを標準出力(画面)に出す [user@server ~]$ cat < file.txt (file.txtの中身が表示される)
(これは cat file.txt とまったく同じ結果になりますけど、cat が「引数でファイルを開いた」のか「標準入力からデータを受け取った」のか、っていう内部的な動作が違うんですね)
▼ << (ヒアドキュメント)
シェルスクリプトで、複数行のまとまったテキストをコマンドに直接入力したい場合に使う、すっごく強力な機能です。
[コマンド] << [終了文字列]
[終了文字列] は EOF (End Of File) や STOP など、好きな文字列を使えます。
実行例: cat とヒアドキュメントで設定ファイルを作成する
[user@server ~]$ cat << EOF > httpd-vhost.conf ServerName www.example.com DocumentRoot "/var/www/html" EOF
このコマンドは、cat に対して << EOF から次の行の EOF までの間のすべて(<VirtualHost ... </VirtualHost>)を標準入力(0)として流し込んで、cat はそれを受け取って標準出力(1)に出して、最終的に > httpd-vhost.conf によってファイルに保存される、っていう流れです。
linux cut コマンド - テキストを行単位で「切り出す」
echo や cat がテキスト全体を扱うのに対して、linux cut は、テキストの行から特定の部分だけを「切り出す」ためのコマンドです。
CSVファイル、TSVファイル、ログファイルみたいに、決まった形式(区切り文字)で整形されたデータの処理に、絶大な威力を発揮しますよ!
cut は通常、cat なんかで読み込んだデータをパイプ(|)で受け取って使います。
用途1:-d (区切り文字) と -f (フィールド) で切り出す
CSVファイル(カンマ区切り)や /etc/passwd(コロン区切り)みたいなデータに最適です!
- -d [区切り文字] (
--delimiter)
フィールド(列)を区切っている文字を指定します。 - -f [フィールド番号] (
--fields)
取り出したいフィールド(列)の番号を指定します。(1から始まりますよ!)
実行例1: /etc/passwd からユーザー名(1列目)だけを取り出す
/etc/passwd は :(コロン)で区切られていますよね。
[user@server ~]$ cat /etc/passwd | cut -d ':' -f 1 root daemon bin user ...
cat で /etc/passwd を読み込んで、その結果をパイプ(|)で cut に渡します。
cut は -d ':'(コロンで区切って)-f 1(1番目のフィールドだけ)を取り出します。
実行例2: CSVファイルから2列目と4列目を取り出す
# data.csv の中身
ID,Name,Price,Category
101,Apple,150,Fruit
102,Banana,100,Fruit
201,Cabbage,200,Vegetable
[user@server ~]$ cat data.csv | cut -d ',' -f 2,4 Name,Category Apple,Fruit Banana,Fruit Cabbage,Vegetable
-f 2,4 のようにカンマで区切ると、複数のフィールドを指定できます。
-f 1-3 みたいにハイフンでつなぐと「1列目から3列目まで」を指定できますよ。
用途2:-c (文字数) で切り出す
区切り文字じゃなくて、単純に「何文字目から何文字目まで」ってバイト数(または文字数)で切り出すこともできます。
- -c [範囲] (
--characters)
取り出したい文字の位置を指定します。
実行例: ls -l の結果からパーミッション部分(1〜10文字目)だけを切り出す
[user@server ~]$ ls -l | cut -c 1-10 合計 12 drwxr-xr-x -rw-rw-r-- -rwxr-xr-x
cut はこんな風に、整形されたテキストの処理に特化してますけど、空白(スペース)の数が変動するような複雑なテキストの処理は苦手なんです…
(そういう場合は awk や sed の出番となります!)
シェルスクリプトの基礎文法(if, ワイルドカード, 引数, 配列)
ここまでに学んだ echo, cat, cut, リダイレクト は、それ単体でもすっごく便利ですけど、実はそれらは「シェルスクリプト」っていう自動化プログラムを作るための「部品」なんです。
関連キーワードとして指定された「linux if」「linux ワイルドカード」「linux 引数」「linux 配列」は、まさにこのシェルスクリプトの基礎文法そのものなんですよ!
linux if 文 - 条件分岐の基本
シェルスクリプトで「もし〇〇なら、XXする」っていう条件分岐を行うのが if 文です。
基本構文:
if [ 条件式 ]; then # 条件式が「真 (True)」だった場合の処理 elif [ 別の条件式 ]; then # 別の条件式が「真 (True)」だった場合の処理 else # すべての条件式が「偽 (False)」だった場合の処理 fi
if と [ の間、[ と 条件式 の間、条件式 と ] の間には、必ずスペースが必要なので、気をつけてくださいね!
(表2)if 文でよく使う条件式(テスト演算子)
演算子 意味 使用例 ファイル系 -f [ファイル] ファイルが存在し、通常ファイルである if [ -f "file.txt" ]; then ... -d [ディレクトリ] ディレクトリが存在する if [ -d "logs/" ]; then ... -e [パス] パスが存在する(ファイルでもディレクトリでも) if [ -e "/tmp/lock" ]; then ... -z [文字列] 文字列の長さがゼロである if [ -z "$VAR" ]; then ... -n [文字列] 文字列の長さがゼロでない if [ -n "$VAR" ]; then ... 文字列比較 [文字列1] = [文字列2] 文字列1と文字列2が等しい if [ "$USER" = "root" ]; then ... [文字列1] != [文字列2] 文字列1と文字列2が等しくない if [ "$ACTION" != "start" ]; then ... 数値比較 [数値1] -eq [数値2] 等しい (Equal) if [ $COUNT -eq 0 ]; then ... [数値1] -ne [数値2] 等しくない (Not Equal) if [ $COUNT -ne 0 ]; then ... [数値1] -gt [数値2] より大きい (Greater Than) if [ $COUNT -gt 10 ]; then ... [数値1] -ge [数値2] 以上 (Greater or Equal) if [ $COUNT -ge 10 ]; then ... [数値1] -lt [数値2] より小さい (Less Than) if [ $COUNT -lt 10 ]; then ... [数値1] -le [数値2] 以下 (Less or Equal) if [ $COUNT -le 10 ]; then ...
(重要!)if 文で変数($VAR)を扱う時は、中身が空だったりスペースを含んでいたりする場合の誤動作を防ぐため、必ず "(ダブルクォート)で囲む ([ "$VAR" = "test" ]) 癖をつけましょうね!
linux ワイルドカード - 複数のファイルを効率よく扱う
ワイルドカードは、ファイル名を指定する時に、複数のファイルに一致(マッチ)するパターンを指定できるシェルの便利な機能です。
cat *.log の * が、まさにこれです!
- * (アスタリスク)
0文字以上の任意の文字列に一致します。
.txt : a.txt, hello.txt など、末尾が .txt のすべてに一致。
file : file1, file_new, file など、file で始まるすべてに一致。
* : すべてのファイル・ディレクトリに一致。 - ? (クエスチョンマーク)
任意の1文字に一致します。
file?.txt : file1.txt, fileA.txt には一致するけど、file10.txt には一致しません。 - [] (ブラケット)
括弧内のいずれか1文字に一致します。
[abc].txt : a.txt, b.txt, c.txt のいずれかに一致。
[0-9].txt : 0.txt, 1.txt ... 9.txt に一致(範囲指定)。
[a-zA-Z].log : アルファベット1文字で始まる .log ファイルに一致。
実行例
# 2025年11月のログだけを連結して月次ログを作成 cat 2025-11-??.log > monthly_2025_11.log
Chapter 1, 3, 5 だけを表示
cat chapter[135].txt
linux 引数(ひきすう) - スクリプトに外から情報を渡す
シェルスクリプト(例: backup.sh)を作る時、スクリプト実行時に「どのディレクトリをバックアップするか」みたいな情報を外から渡したい場合がありますよね。
これが「linux 引数」 です。
スクリプトの中で、引数は「特殊変数」として扱われます。
- $0 : スクリプト自体の名前(例: ./backup.sh)
- $1 : 1番目の引数
- $2 : 2番目の引数
- ...
- $9 : 9番目の引数
- ${10} : 10番目以降の引数({} が必要です)
- $# : 渡された引数の総数(数値)
- $@ : 渡されたすべての引数を、個別の文字列として扱う(
"a b" "c" は "a b" と "c") - $* : 渡されたすべての引数を、一つの文字列として扱う(
"a b" "c" は "a b c")
(for ループなんかで引数を個別に扱いたい場合は、必ず "$@" を使いますよ!)
実行例: check.sh(引数が2個ないとエラーにする)
#!/bin/bash
(check.sh という名前で保存)
引数の数 ($#) が 2 でない (!= -ne) 場合
if [ $# -ne 2 ]; then # 使い方を「標準エラー出力(2)」に echo する echo "エラー: 引数が正しくありません。" >&2 echo "使い方: $0 [ユーザー名] [パスワード]" >&2 exit 1 # 異常終了 fi
echo "ユーザー名: $1" echo "パスワード: $2"
[user@server ~]$ chmod +x check.sh # 実行権限を付与
[user@server ~]$ ./check.sh admin エラー: 引数が正しくありません。 使い方: ./check.sh [ユーザー名] [パスワード]
[user@server ~]$ ./check.sh admin p@ssword ユーザー名: admin パスワード: p@ssword
linux 配列(Bash/Zsh) - 複数の値をまとめて管理する
cat などの基本コマンドとは直接関係ないですけど、「linux 配列」 もシェルスクリプトですっごく重要な概念です。
複数の文字列(サーバー名、ファイルリストとか)を、一つの変数にまとめて格納する仕組みのことですね。
(古い sh では使えなくて、bash や zsh の機能ですよ)
- 配列の定義:
servers=("web01" "db01" "app01") - 要素へのアクセス:
echo ${servers[0]} (0番目(最初)の要素。結果: web01)
echo ${servers[1]} (1番目(2番目)の要素。結果: db01) - すべての要素:
echo ${servers[@]} (結果: web01 db01 app01) - 要素の総数:
echo ${#servers[@]} (結果: 3) - 要素の追加:
servers+=("lb01") - 要素の削除:
unset servers[1] (db01 を削除)
実行例: for ループと 配列 の組み合わせ
#!/bin/bash
処理対象のサーバーリストを配列で定義
servers=("web01" "db01" "app01")
echo "=== サーバーのステータスを確認します ==="
配列のすべての要素 ($@) に対してループ処理
for srv in "${servers[@]}"; do echo "Checking $srv ..." # ssh $srv "uptime" # (実際にはここでsshするなどの処理) sleep 1 done
echo "=== すべての確認が完了しました ==="
こんな風に、「配列」 と for ループを組み合わせることで、複数の対象に対する繰り返し処理を、すっごくエレガントに記述できますよ!
まとめ
「linux cat」っていう一つのコマンドから始まったこの記事は、「linux echo」による出力、「linux cut」による切り出し、そしてLinuxシェルの心臓部である「linux リダイレクト」へと深く進んできましたね。
最後に、この記事で学んだ最重要ポイントを、もう一度おさらいします!
✅ echo は「出力」の基本!
シェルスクリプトの「目」になって、変数($VAR)の中身確認やログ出力に使います。
"(展開される)と '(展開されない)の違いをマスターすることがすっごく重要です。
✅ cat は「連結」の基本!
cat の本質は「連結(concatenate)」です。
cat file1 file2 > combined.txt みたいに、リダイレクトと組み合わせて真価を発揮します。
巨大なファイルの表示には less や tail を使いましょうね!
✅ cut は「切り出し」の基本!
-d(区切り文字)と -f(フィールド番号)を使って、整形されたテキストから必要な列だけを抜き出します。
✅ リダイレクト はシェルの心臓部!
「標準入力(0)」「標準出力(1)」「標準エラー出力(2)」の3つの流れを理解することがすべてです。
>(上書き)、>>(追記)、2>(エラー上書き)、2>>(エラー追記)を使い分けましょう。
command > file.log 2>&1 は、「正常な出力(1)」と「エラー(2)」の両方を file.log にまとめるためのおまじないです!
command > /dev/null 2>&1 は、すべての出力を「捨てる」ためのイディオム(決まり文句)です。
✅ if, ワイルドカード, 引数, 配列 はスクリプトの基礎!
「linux if」 文([ -f file ] や [ $# -eq 0 ])で条件分岐を行います。
「linux ワイルドカード」(*, ?, [])で複数のファイルをパターンマッチさせます。
「linux 引数」($1, $#, "$@")でスクリプトに外から情報を渡します。
「linux 配列」(servers=(...))で複数の値をまとめて扱います。
cat や echo は、単なる小さなコマンドじゃありません。
これらを「リダイレクト(>)」や、まだ詳しく解説していない「パイプ(|)」で繋ぎ合わせて、if 文や for ループで制御することで、Linuxは強力な「自動化プラットフォーム」へと変貌するんです!
次のステップとして、テキスト処理をさらに極める grep(検索)、sed(置換)、awk(列処理)といったコマンドを学んでいくと、あなたのLinuxスキルはさらに飛躍するでしょう!💪✨


コメント