ハードウェア、カーネル、そしてシェル
コンピュータシステムにおいて、シェル(Shell)はユーザーがオペレーティングシステム(OS)と対話するためのインターフェースです。ユーザーが入力したコマンドをシェルが受け取り、それをカーネルに伝え、最終的にハードウェアを操作します。このように、シェルはシステムの最外層に位置し、「殻(shell)」のようにカーネルを包み込む役割を果たします。
シェルを学ぶ理由
Linuxサーバー環境ではGUIが省かれ、軽量かつ効率的な運用のためにシェルによる操作が主流です。また、高度な設定や自動化スクリプトの実行にもシェルが不可欠です。
Bashシェルの主な機能
- 履歴コマンド:↑↓キーで過去のコマンドを再利用可能
- 補完機能:Tabキーでコマンドやファイル名を自動補完
- エイリアス:頻繁に使うコマンドに短縮名を設定可能(例:
alias ll='ls -l') - ワイルドカードとスクリプト対応:柔軟なファイル操作と自動化が可能
コマンドの種類確認(type)
type コマンドで、指定されたコマンドが組み込みか外部かを確認できます。
$ type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
シェル変数の扱い
変数は一時的なデータ格納に使用され、環境変数(例:PATH, HOME)はシステム全体で共有されます。
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
$ name="taro"
$ echo $name
taro
$ msg="言語: $LANG"
$ echo $msg
言語: ja_JP.UTF-8
$ raw='言語: $LANG'
$ echo $raw
言語: $LANG
$ unset name
環境変数と特殊変数
env で環境変数一覧、set で全変数(ユーザ定義含む)を表示できます。
$ echo $$ # 現在のプロセスID
1234
$ false
$ echo $? # 直前のコマンドの終了ステータス
1
ユーザー入力(read)
read で標準入力を変数に代入できます。
$ read input
こんにちは
$ echo $input
こんにちは
変数の型宣言(declare)
declare で変数の属性を指定できます。
$ sum=100+200
$ echo $sum
100+200
$ declare -i sum=100+200
$ echo $sum
300
# 配列の例
$ arr[0]="apple"
$ echo ${arr[0]}
apple
リソース制限(ulimit)
ulimit -a で現在のプロセスリソース制限を確認できます。
変数のパターン置換
$ file="/var/spool/mail/root"
$ echo ${file##/*/}
root
$ echo ${file%/*}
/var/spool/mail
コマンド履歴(history)
デフォルトで最大1000件のコマンドが記録され、history で参照可能です。
リダイレクト(>, >>, <)
cmd > file:標準出力を上書きcmd >> file:標準出力を追記cmd 2> err.log:エラー出力をファイルへcmd | tee file:画面表示とファイル保存を同時に行う
複数コマンドの連結
cmd1 ; cmd2:常に両方実行cmd1 && cmd2:cmd1 成功時のみ cmd2 実行cmd1 || cmd2:cmd1 失敗時のみ cmd2 実行
パイプとフィルタリング(cut, grep)
$ echo $PATH | cut -d: -f1,3
/usr/local/sbin:/usr/sbin
$ ps aux | grep ssh
テキスト処理(sort, uniq, wc)
$ sort /etc/passwd
$ last | cut -d' ' -f1 | sort | uniq -c
$ cat file.txt | wc -l
文字変換・結合(tr, join, paste)
$ echo "hello" | tr 'a-z' 'A-Z'
HELLO
$ join -t: /etc/passwd /etc/shadow
$ paste file1 file2