ディレクトリ操作

現在ディレクトリのフルパス表示

pwd

指定ディレクトリへ移動

cd dir

cd~に移動

cd -:移動前のディレクトリに戻る

現在ディレクトリのファイル一覧表示

ls

ls dir:指定ディレクトリのファイル一覧表示

-l 詳細情報を表示
-o グループ名を非表示(それ以外は-lと同じ)
-a .から始まるファイルを表示
-A .から始まるファイルを表示(...は表示しない)
-F /(ディレクトリ)・*(実行ファイル)・@(シンボリックリンク)を表示
-G 色付け
-@ ファイルの拡張属性を表示(詳細はxattrコマンド)
-i ファイルのinodeを表示
-m ファイルを, で区切って表示
-R ディレクトリの内部を再帰的に表示
-t 時間で並び替え(デフォルトではmtime
-u -lの時間表示・並び替えの順番をatimeに変更
-c -lの時間表示・並び替えの順番をctimeに変更
-U -lの時間表示・並び替えの順番をファイル作成日時に変更(Linuxでは並び替えを無効にする)

mtime / atime / ctimeについて

mtime ファイルの内容が変更された日時
atime ファイルに最後にアクセスした日時
ctime ファイルの属性(アクセス権/inodeなど)が変更された日時
作成日時 ファイルが作成された日時(OS Xのみ)

現在ディレクトリを記憶し、ディレクトリ移動

pushd dir

別のディレクトリに移動し、戻ってくるときにpopdと合わせて使用する。

pushdで記憶したディレクトリに戻る

pushd

pushdで記憶したディレクトリ一覧を表示

dirs

新規ディレクトリを作成

mkdir dir

-p:ディレクトリを再帰的に作成(例:mkdir -p files/img

-m:アクセス権を指定(例:mkdir -m u+x files

空のディレクトリを削除

rmdir dir

指定ディレクトリとサブディレクトリの容量を表示

du dir

-h:適切な単位をつける

-s:指定ディレクトリのみを表示(下階層のディレクトリは表示しない)

-c:指定ディレクトリの中身の合計の容量を表示

現在ディレクトリ以下のファイルをツリー状に表示

tree

Homebrewによって追加

ファイル操作

ファイル・ディレクトリを削除

rm file/dir

-r:ディレクトリを再帰的に削除

-f:確認をせずに削除

ファイル・ディレクトリの移動 / ファイル名の変更

mv file/dir new_name/go_dir

-f:同名のファイルがある場合、上書きする

-i:同名のファイルがある場合、確認する

-u:同名のファイルがある場合、[後]が新しい場合は上書きしない

ファイル・ディレクトリのコピー

cp file/dir new_name/go_dir

-a:ディレクトリ構造や属性を保持(-pPR

-d:シンボリックリンクの実体をコピー

-f:同名のファイルがある場合、上書きする

-i:同名のファイルがある場合、確認する

-r:ディレクトリを再帰的にコピーする

空ファイルを作成 / アクセス・変更日時を更新

touch file
-a アクセス日時(atime)のみ更新
-m 変更日時(mtime)のみ更新
-c ファイルが存在しない場合、ファイルを作成しない
-t [[CC]YY]MMDDhhmm[.ss] 指定日時にアクセス日時・変更日時を変更
-r file 指定ファイルと同じアクセス・変更日時に変更

作成・変更日時を更新

setfile file
-d mm/dd/[yy]yy [hh:mm:[:ss] 作成日時を変更
-m mm/dd/[yy]yy [hh:mm:[:ss] 変更日時(mtime)を変更

ファイルの情報を表示

getfileinfo file

アクセス権を変更

chmod permission file

アクセス権には[ugoa][+-][rwx]が入る。3桁の数字も使用できる。

u g o a:ユーザー・グループ・その他・すべて

+ -:権限を追加・削除

r w x:読み出し・書き込み・実行

ファイルの属性を変更

chflags flag file

hidden, nohidden:非表示 / 表示

ファイルの種類を調べる

file file

ファイルの内容表示

less file

-R:色を変換

ファイルの拡張属性を表示

xattr command

xattr -l file:拡張属性の一覧を表示

xattr -d attr file:拡張属性を削除

ファイルやフォルダを開く

open file/dir

-a app:指定アプリケーションで開く

-b bundlecom.apple.TextEdit形式

-e:テキストエディットで開く

-W:アプリケーションが終了するまでopenも終了しない

-n:アプリのコピーを起動

-R:Finderに表示

2つのディレクトリを同期

rsync file/dir go_dir
-a ディレクトリ構造や属性を保持(-rlptgoDと同じ)
-r ディレクトリを再帰的にコピー
-l シンボリックリンクを保持(指定しないと実体がコピーされる)
-p パーミッションを保持
-t タイムスタンプを保持
-g グループを保持(指定しないとコピーしたユーザーのものになる)
-o 所有者を保持(指定しないとコピーしたユーザーのものになる)
-D デバイスファイル(スペシャルファイル)を保持(--devices --specialsと同じ)
-H ハードリンクを保持(指定しないと実体がコピーされる)
-v コピー中のファイル名を標準出力(-vv, -vvvとするとさらに詳細な情報を出力する)
-I すべてのファイルを同期(指定しないと同じファイルサイズ・修正時間のファイルは同期しない)
-n 実際には同期せずに、同期後の結果をシミュレーションする
-z 転送時にgzip圧縮する
-h --progress--statsで表示される単位をわかりやすくする
-u 同期元よりも同期先のファイルの方が新しい場合、そのファイルは同期しない
-c 同期元と同期先のファイルの比較の際、128ビットのMD4を使用する(デフォルトではファイルサイズと変更日)
-q 同期中に情報を表示しない
--delete 同期元にないファイルが同期先にあった場合、そのファイルを削除する
--delete-excluded --excludeに一致しているファイルも、同期先にあった場合は削除する
--exclude=パターン パターンに一致するファイルを同期しない
--progress 同期中にファイルの転送速度を表示
--partial 転送が中断された場合に不完全なファイルを残す
--stats 同期終了後に統計情報を表示
--existing 同期先にないファイルは同期しない(同期元に新規作成されたファイルは対象外にする)
--ignore-existing 同期先にあるファイルは同期しない(同期元に新規作成されたファイルのみを対象とする)
--no-オプション 指定オプションを無効にする(例:--no-D

ローカルからローカルにコピー:

rsync -av sourcedir destdir

ローカルからリモートにコピー:

rsync -avz localdir user@host:remotedir

文字化けするときは以下をする(rsync3以上):

--iconv=UTF8-MAC,UTF-8

ハードリンク・シンボリックリンクを作成

ln target_file/dir file/dir

-s:シンボリックリンクを作成(デフォルト:ハードリンク)

-f:同名のファイルがある場合、上書きする

-i:同名のファイルがある場合、確認する

シンボリックリンクはFinderでエイリアスとして扱われる。元ファイルがなくなるとアクセスできなくなる。

ハードリンクは片方を削除しても元ファイルは消えない。すべて削除すると元ファイルは消える。

ファイルのバイナリデータを表示

od file

od -tx1c file:文字ごとにバイナリを表示

MP3のID3タグを編集

eyed3 file

すべてのタグを削除

eyed3 --remove-all file

ファイルの圧縮/解凍/暗号化

ファイルをZIP圧縮

zip file/dir new_file/dir

-e:暗号化

-r:ディレクトリを再帰的に処理

-q:処理内容を非表示

ZIPファイルを解凍

unzip file

ZIPファイルをパスワード付きに変更

zipcloak file

ファイルを圧縮/解凍

tar [zjJ][xct]vf file.tar file

z:gzip(.tar.gz)

j:bzip2(.tar.bz2)

J:lzma(.tar.xz)

x:解凍(extract)

c:圧縮(create)

t:一覧(list)

v:詳細表示(verbose)

f:ファイル指定(file)

ファイルをJar圧縮/解凍

jar [xct]vf file.jar file

x:解凍(extract)

c:圧縮(create)

t:一覧(list)

v:詳細表示(verbose)

f:ファイル指定(file)

ファイルを暗号化・復号化など

openssl command
openssl enc -e -aes-[128|192|256]-cbc -in in_file -out out_file AESで暗号化
openssl enc -d -aes-[128|192|256]-cbc -in in_file -out out_file AESで復号化
openssl dgst -[md5|sha256|sha512] file ファイルのハッシュを表示

ファイル移動/コピーコマンドの挙動

元のディレクトリ構造:

bar/
foo/
├── a
├── b
└── c
cp foo bar エラー(foo/ is a directory)
cp foo bar/
cp foo/ bar
cp foo/ bar/
cp foo/* bar bar/a, b, c
cp foo/* bar/
cp -r foo bar bar/foo/a, b, c
cp -r foo bar/
cp -r foo/ bar bar/a, b, c
cp -r foo/ bar/
mv foo baz foo/→baz/
mv foo baz/
mv foo/ bar bar/foo
mv foo/ bar/
rm foo エラー(foo: is a directory)
rm foo/
rm foo/* foo/a, b, c→foo/
rm -r foo foo→削除
rm -r foo/

ファイル検索

指定ディレクトリ以下の、条件に一致するファイルを表示

find dir

-name "word":ファイル名一致(-name "*[文字列]*":ファイル名を含む)

-size [+-][size][ckMG]:ファイルサイズ(+-は以上, 以下、ckMGはByte, KB, MB, GB)

-atime [+-][time][smhdw]:最終アクセス日時(smhdwは秒, 分, 時間, 日, 週)

-mtime [+-][time][smhdw]:最終更新日時

Spotlight検索

mdfind dir

-name "[文字列]":ファイル名を含む

-onlyin [ディレクトリ名]:指定ディレクトリ内を検索

高速検索

locate word

データベースを更新するにはsudo /usr/libexec/locate.updatedbを実行する

aliasupdatedb=sudo /usr/libexec/locate.updatedb

テキスト処理

ほとんどのものは ファイル名 を省略可能。その場合標準入力から入力する。

先頭から指定行出力

head -number file

ファイルの末尾指定行数 / 指定行以降を出力

tail [-+]num file

-:ファイルの末尾指定行数を表示

+:ファイルの指定行以降を表示

ファイルの内容を出力

cat file

ファイル名をスペースで区切り、複数指定すると、連結することができる。

-n:行番号を付加

指定文字列がある行だけを表示

grep "word" file

-v:マッチしない行を表示

-c:マッチした行数を表示

-[行数]:マッチした行の前後の指定行数を表示

-A:マッチした行の前の指定行数を表示

-B:マッチした行の後ろの指定行数を表示

正規表現も使用できる。

各行から文字を切り出す

cut -c[num] file

-c5:5文字目

-c1,3:1, 3文字目

-c2-5:2〜5文字目

-c-3:先頭から3文字

-c5-:5文字目以降

各行の文字列の置換をする

sed 's/word/replaced_word/'

正規表現も使用できる。

sed -i '' 's/word/replaced_word/' file:ファイルを上書き

各行の文字の置換をする

tr char replaced_char

tr -d [文字]:指定文字を削除

tr -s [文字]:指定文字の繰り返しを1文字にまとめる

tr a-z A-Z:すべて大文字に置換

様々なテキスト処理を行う

awk '条件/処理' file

awk '{print $[列]}':各行の指定列目を出力(無指定の場合は行全体、$1〜$nはそれぞれの行を表す)

awk '{print $[列,列]}':区切り文字で区切って出力

awk '{print $[列 列]}':文字を連結して出力(スペースを間に挟まない)

awk '/[文字列]/{print $0}':指定文字列を含む行のみ出力

awk '$1=="[文字列]"{print $0}':1列目が指定文字列の行のみ出力

awk 'NR==[行]{print $0}':指定行目のときのみ出力(NRには現在処理中の行番号が代入される)

awk '/^[文字1]/{print $0}/^[文字2]/{print $0}':文字1から始まる行と文字2から始まる行を出力

awk -F',' '{print}':入力区切り文字を変更(デフォルトは1文字以上の連続するスペース/タブ・正規表現も使用できる)

awk -F '[(,{}]' '{print}':入力区切り文字を複数指定(( , { }が例では指定されている)

行単位で並べ替えを行う

sort file

-b:行頭の空白を無視

-f:大文字小文字を区別しない

-r:降順

-u:重複行を削除

-n:先頭の数字や記号を数値とみなす(-bも設定される)

-k 列1[,列2]:指定列を基準にしてソート

-t 区切り文字:区切り文字を指定

LANG=lang sort fileとすると言語を指定できる。

C:文字コード順(速度はen_US.UTF8と同じ)

en_US.UTF8:文字コード順(速度はCと同じ)

ja_JP.UTF-8:アルファベットはアルファベット順。それ以外は長さで比較し、同じだった場合は文字コード順。(最も遅い)

ファイルの行数・単語数・バイト数を表示

wc file

-l:行数のみ

-w:単語数のみ

-c:バイト数のみ

差分を表示

diff fileA fileB

重複行を削除して表示

uniq file

文字コード変換・確認

nkf file

-g:文字コード確認

-w:UTF-8(BOMあり)に変換

-w8:UTF-8(BOMなし)に変換

-s:Shift-JISに変換

-e:EUCに変換

-j:JISに変換

漢字・ひらがな・カタカナ・アルファベット変換

kakasi -[option][replaced_option]

a:アスキー文字(アルファベット)

H:ひらがな

K:カタカナ

J:漢字

標準入力から入力する。文字化けする場合はnkfを挟む。

XMLの指定パス部分を出力

xpath file xml_path

xpath a.xml /html/body/h1<html><body><h1>test</h1></body></html>というHTMLのh1を出力

-w:UTF-8(BOMあり)に変換

-w8:UTF-8(BOMなし)に変換

Base64のエンコード・デコード

base64

-D:デコード

コマンド

コマンドの使用方法を表示

man command

コマンドの絶対パスを表示

which command

aliasが設定されている場合も元コマンドのパスを返す。

コマンドの情報・絶対パスを表示

type command

aliasが設定されている場合はaliasのコマンドを返す。

コマンドの実行にかかった時間を表示

time command

コマンドの履歴を表示

history

-c:履歴を削除

ネットワーク

Webファイルダウンローダ / アップローダ

curl URL

img[000-009].jpgimg000.jpgからimg009.jpgまでダウンロードする

img{004,008}.jpgimg004.jpgimg008.jpgをダウンロードする

-o [ファイル名]:ファイルを保存(初期設定では出力のみ)

-O:URL上のファイル名で保存

-i:HTTPヘッダー情報も表示

-I:HTTPヘッダー情報のみ表示

-#:プログレスメータではなくプログレスバーを表示

-s:プログレスメータを非表示

Webファイルダウンローダ

wget URL

-O [ファイル名]:ファイル名を指定して保存(ディレクトリ指定も可能だが、存在しないとエラーになる)

-P [ディレクトリ名]:ディレクトリ名を指定して保存(存在しない場合自動で作成する)

-O -:ファイルに保存せずに、出力のみする

Webサイトのスクリーンショットを保存

webkit2png URL

Homebrewによって追加

指定ホスト/IPへの接続確認

ping host/IP

ネットワーク設定状況を表示

ifconfig

ifconfig en1:インターフェース名で絞り込み

DNSサーバへの問い合わせ

nslookup host

パケットの経路を表示

traceroute host

hostsファイル

ホスト名とIPアドレスを結びつけるもの

DNSの前に参照される

/etc/hostsに以下の書式で書く。

IPアドレス ホスト名

例:

127.0.0.1 localhost

間には1つ以上のスペースまたはタブ文字を入れる。

FTP接続

ftp host

コマンド一覧

ls リモートls
cd dir リモートcd
pwd リモートpwd
mkdir リモートmkdir
rename リモートmv
!ls ローカルls
lcd dir ローカルcd
lpwd ローカルpwd
!mkdir ローカルmkdir
get file ダウンロード
put file アップロード
delete file 削除
ascii asciiモード
binary binaryモード
type モード表示
exit / bye 切断

Time Capsuleをマウント

mkdir /Volumes/dir
mount_afp afp://user:pw@192.168.1.2/dir /Volumes/dir

パッケージ管理

Homebrew

brew command
doctor 診断
-v バージョン表示
search [パッケージ名] パッケージの検索
install [パッケージ名] パッケージのインストール
remove [パッケージ名] パッケージのアンインストール
link [パッケージ名] パッケージの有効化
unlink [パッケージ名] パッケージの無効化
update Homebrewのアップデート
upgrade パッケージのアップデート
list インストール済みパッケージ一覧

Homebrew Cask

brew cask command
install [アプリ名] アプリをインストール
uninstall [アプリ名] アプリをアンインストール
search [アプリ名] アプリを検索
list インストール済みアプリ一覧
cleanup 不要なdmgファイルを削除

Yum (Yellowdog Updater Modified)

yum command
search [パッケージ名] パッケージの検索
install [パッケージ名] パッケージのインストール
remove [パッケージ名] パッケージのアンインストール
update パッケージのアップデート
list インストール可能なパッケージ一覧
list installed インストール済みパッケージ一覧
info [パッケージ名] パッケージの情報を表示

-y:問い合わせにすべてyと答える

UNIXで使用される。

RubyGems

gem command
list [文字列] 指定文字列から始まるパッケージを検索
search [文字列] 指定正規表現に一致するパッケージを検索
install [パッケージ名] パッケージのインストール
uninstall [パッケージ名] パッケージのアンインストール
which [パッケージ名] パッケージの場所を表示
-v バージョン表示
update --system gemのアップデート

-blist, search検索時に、ローカル以外も対象とする

npm [コマンド]

Node.js Package Manager

s [パッケージ名] パッケージの検索
i [パッケージ名] パッケージのインストール
r [パッケージ名] パッケージのアンインストール
info [パッケージ名] パッケージの情報を表示
ls インストール済みパッケージ一覧
init package.jsonの生成
-v バージョン表示

-g:グローバル

パッケージ名はスペース区切りで複数指定可能。バージョン指定はパッケージ名の後に@を付けて行う。例:

$ sudo npm i -g パッケージ名@バージョン

システム

ログイン履歴を表示

last

last console:コンピュータにログイン・ログアウトした時刻を表示

ディスクの容量を表示

df

-h:適切な単位をつける

実行中はスリープしない

caffeinate

-d:ディスプレイをスリープしない

-i:システムをスリープしない

-m:ディスクをスリープしない

アプリケーションを強制終了

killall app

注意:アプリケーション名の最初は大文字で指定する。(FinderDock

自分のユーザ名を表示

whoami

初期設定ファイルの変更

defaults command

~/Library/Preferences/以下のplistファイルが変更される。

defaults write file 設定項目 設定値:設定値の追加と変更

defaults delete file 設定項目:設定項目の削除

defaults read file:設定ファイルを表示

音声ファイルを再生

afplay file

-r:速度調整(標準:1)

-v:音量調整

-q:音質調整(高音質:1)

-rをつけたときは-q 1をつける。

文字列を読み上げ

say word

-v [声]:声の変更(?を指定すると一覧が表示される・デフォルト:Kyoko)

-f [ファイル名]:ファイルから入力

-o [ファイル名]:ファイルに出力

-r [速さ]:速さを変更(1分間に読み上げる単語数)

UUIDを生成

uuidgen

通知を表示

terminal-notifier [オプション]

-title [文字列]:タイトル

-subtitle [文字列]:サブタイトル

-message [文字列]:メッセージ(必須)

-activate [アプリケーション名]:クリック時にアプリを起動(com.apple.Safariなどと指定)

-appIcon [ファイルURL]:左に表示するアイコン

-contentImage [ファイルURL]:右に表示するアイコン

-open [URL]:クリック時にURLを開く

-execute [コマンド]:クリック時にコマンドを実行

Homebrewによって追加

標準入力の内容をクリップボードにコピー

pbcopy

クリップボードに入っているものを標準出力へ渡す

pbpaste

コンピュータの情報を表示

sysctl -a

標準入力を元にして生成したコマンドを実行する

xargs command

条件に一致したファイルに対して、コマンドを実行する

aから始まるファイルの詳細情報を表示する:

find . -name "a*" | xargs ls -la

FFmpeg

動画を変換

ffmpeg -i file options new_file

コーデックを指定

-c:[v,a] codec
H.264 libx264
H.265 libx265
MPEG4 mpeg4
AAC libfaac
MP3 libmp3lame

ビットレートを指定(kbps)

-b:[v,a] [bitrate]k

解像度を指定

-s 横x縦

縦横比は保持される(縦の値が優先される)

アスペクト比を指定

-aspect 横:縦

縦横比は保持されない(引き伸ばされる)

指定範囲をトリミング

トリミング開始地点を指定

-ss [秒]

-iより前に書く

トリミング終了地点をトリミング開始地点からの経過時間で指定:

-t [秒]

トリミング終了地点を動画開始地点からの経過時間で指定

-to [秒]

時間指定はhh:mm:ss[.xxx]でもできる

フレームレートを指定

-r [fps]

映像 / 音声をOFF

-vn / -an

映像 / 音声にフィルターを付ける

-filter:[v,a] filter

ダブルクォーテーションで囲むとカンマ区切りで複数指定できる

映像

hflip 水平反転
vflip 垂直反転
setpts=n*PTS 速度変更(n倍の長さ)
unsharp=luma_amount=n ぼかし / シャープ
(+:シャープ / -:ぼかし)
rotate=度*PI/180 回転

音声

volume=n 音量変更(n倍の音量)
atempo=n 速度変更(n倍の速さ)

volumeは表示される時間がおかしくなる場合があるので、
その場合は再エンコードする

atempo0.5〜2までしか指定できないが、複数指定できる

複数の入力にまとめてフィルターを付ける

-filter_complex filter
overlay=x:y 動画/画像などを重ねる(x, yは左上からの距離)

overlayは複数指定すると、2個目と3個目のファイルなどを重ねられる

H.264の品質を指定

-preset option

ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placeboがある

veryfastが1番良い

エラーの対処

-pix_fmt yuv420p
-vsync 2

32kbps未満はエラーが出ることがある

-b:a 32k

プログラム実行・構文チェック

Shell Sciriptを実行

ファイルを実行する場合:./shell.sh

Rubyを実行

ruby -e 'puts "Hello World!"'

ファイルを実行する場合:ruby ruby.rb

インタラクティブにRubyを実行

irb

コードを入力すると、すぐに結果が帰ってくる。Interactive Rubyの略。

PHPファイルを実行

php php.php

Perlを実行

perl -e 'print "Hello, world!\n"'

ファイルを実行する場合:perl perl.pl

Pythonを実行

python -c 'print "Hello World!"'

ファイルを実行する場合:python python.py

AppleScriptを実行

osascript -e 'display dialog "Hello world!"'

ファイルを実行する場合:osascript applescript.scpt

AppleScriptをコンパイル

osacompile [ファイル名]

-o:出力ファイル名(.scpt, .appなどでファイル形式を決定)

-x:実行専用ファイル

文字列の表示

文字列を出力(末尾に改行が挿入される)

echo $s:変数の文字列を出力

echo ${s}:変数の文字列を出力

echo "$s":ダブルクォーテーション...変数展開あり

echo '$s':シングルクォーテーション...変数展開なし

echo $s$s:文字列の連結

文字列を出力(末尾に改行が挿入されない)

printf $s:変数の文字列を出力

printf ${s}:変数の文字列を出力

printf "$s":ダブルクォーテーション...変数展開あり

printf '$s':シングルクォーテーション...変数展開なし

printf $s$s:文字列の連結

コメント

#から行末までをコメントアウト

# コメント

囲まれている行をコメントアウト

<< "#__CO__"
aaa
bbb
ccc
#__CO__

変数 / 文字列操作

変数を代入

s="Hello, world!"

''(シングルクォーテーション)で囲った場合、変数展開がされない。

=(イコール)の両側にはスペースを書いてはいけない。

読み込み専用変数を代入

readonly FILE_NAME="hello.sh"

特殊変数

$1~9:指定個目のコマンドライン引数

$#:コマンドライン引数の数

$$:現在のシェルのプロセスID

$*:すべての変数(IFSで区切り文字を変更可能)

$@:すべての変数(IFSの影響を受けない)

$?:直前のコマンドの終了ステータス

文字列連結

$x$y

文字列の長さを取得

${#str}

文字列を切り出し

${str:0:2}

${str:0:2}:1文字目から2文字

${str:1:2}:2文字目から2文字

${str:0:3}:1文字目から3文字

文字列を分割して配列に代入

oldifs=IFS
IFS=','
str='aaa,bbb,ccc'
array=($str)
IFS=oldifs

演算

整数の四則演算をする

expr [式]

1 + 2:加算

1 - 2:減算

1 \* 2:乗算

1 / 2:除算

1 % 2:剰余(除算の余り)

演算子の両側にはスペースをあける。

括弧で計算順序を指定するときは、括弧の前に\(バックスラッシュ)を付ける。

複雑な演算をする

bc

1+2:加算

1-2:減算

1*2:乗算

1/2:除算

1%2:剰余(除算の余り)

1^2:累乗

sqrt(1):平方根

scale=1:小数点以下の桁数設定

標準入力から式は入力する。bc foo.txtともできる。

改行は;(セミコロン)で1行にすることもできる。

記号

リダイレクト

[コマンド] < [ファイル名]:標準入力にファイルを読み込み

[コマンド] > [ファイル名]:標準出力をファイルに上書き

[コマンド] >> [ファイル名]:標準出力をファイルに追記

[コマンド] 2> [ファイル名]:標準エラー出力をファイルに上書き

[コマンド] 2>> [ファイル名]:標準エラー出力をファイルに追記

[コマンド] &> [ファイル名]:標準出力と標準エラー出力をファイルに上書き

[コマンド] &>> [ファイル名]:標準出力と標準エラー出力をファイルに追記

[コマンド] 1> [ファイル1] 2> [ファイル2]:標準出力と標準エラー出力を別々のファイルに上書き

[コマンド] 1>> [ファイル1] 2>> [ファイル2]:標準出力と標準エラー出力を別々のファイルに追記

出力先に/dev/nullを指定すると、出力が破棄される。

パイプ・コマンド連結

[コマンド1] | [コマンド2]:コマンド1の標準出力をコマンド2の標準入力に入れる

[コマンド1] ; [コマンド2]:コマンド1が終わり次第、コマンド2を実行

[コマンド1] && [コマンド2]:コマンド1の終了ステータスが0(成功)なら、コマンド2を実行

[コマンド1] || [コマンド2]:コマンド1の終了ステータスが0以外(失敗)なら、コマンド2を実行

ヒアドキュメント

echo <<'_EOT_'
foo
bar
_EOT_

<<_EOT_:変数・コマンド置換利用可能($を表示するには\$のようにエスケープする)

<<'_EOT_':変数・コマンド置換利用不可

コマンド置換

echo `date`
echo $(date)

配列

変数に配列を代入

array=(a b c)

配列の指定個目の要素を参照

${array[0]}

最初は0から始まる。(zshの場合1)

配列のすべての要素をスペース区切りで取り出す

"${array[@]}"

配列の先頭に要素を追加

array=(d "${array[@]}")

配列の末尾に要素を追加

array+=( d )

配列の先頭以外を取り出す

array=("${array[@]:1}")

配列の末尾以外を取り出す

echo ${array[((${#array[@]}-1))]}

配列の要素数を取り出す

${#array[@]}

配列の要素を上書き

array[2]=4

制御文

if

if [ 条件 ]; then
  # 処理
fi
if [ 条件 ]; then
  # 真の場合の処理
else
  # 偽の場合の処理
fi
if [ 条件 ]; then
  # 真の場合の処理
elif [ 条件 ]; then
  # 真の場合の処理
fi

case

条件分岐

case 値 in
  パターン1 ) 処理1 ;;
  パターン2 ) 処理2 ;;
  ...
  パターンn ) 処理n ;;
esac

while

条件が真の間繰り返す

while [ 条件 ]; do
  # 処理
done

until

条件が偽の間繰り返す

until [ 条件 ]; do
  # 処理
done

for

変数に値を入れながら繰り返す

for 変数 in 値リスト ; do
  # 処理
done

break

ループを抜ける

break 3で多重ループも抜けられる。

continue

ループを1回スキップ

continue 2のようにすると多重ループもスキップできる。

条件式評価

test [式]

testコマンドは真(0)か偽(1)のステータスを返す。

[ 条件 ]と略すことがある(その時[ ]の内側にはスペースを入れる)。

以下の条件に一致したら真(0)が返される。

num1 -eq num2:num1とnum2が等しい(num1=num2)

num1 -ne num2:num1とnum2が等しくない(num1≠num2)

num1 -lt num2:num1がnum2より小さい(num1<num2)

num1 -le num2:num1がnum2以下(num1≦num2)

num1 -gt num2:num1がnum2より大きい(num1>num2)

num1 -ge num2:num1がnum2以上(num1≧num2)

文字列1 = 文字列2:文字列1と文字列2が等しい

文字列1 != 文字列2:文字列1と文字列2が等しくない

条件式1 -a 条件式2:AND条件(&&と表記することもできる)

条件式1 -o 条件式2:OR条件(||と表記することもできる)

関数

関数の定義

関数名(引数1, 引数2...) {
  # 処理
  return 終了ステータス(成功:0・失敗:1)
}

関数の呼び出し(()を付ける必要はない):

関数名 引数

戻り値が存在しないため、rtn=`func`とコマンド置換を使い、出力を取得する。