仮想環境を作ろう
上記を参考にdockerで作れる。
docker exec -it mycentos /bin/bash
で中に入って作業できるよ。
docker stop mycentosでコンテナを停止できるよ。
docker start mycentosで一度作ったコンテナを起動できるよ。
docker ps -aで停止しているコンテナを表示。
docker rm コンテナIDでコンテナのイメージを削除できるよ。
基礎知識
・現在自分が位置しているディレクトリをカレントディレクトリ、またはワーキングディレクトリと呼ぶ。
・ルートディレクトリを起点としてファイルやディレクトリのパスを示すことを絶対パス、もしくはフルパスと呼ぶ。
・逆にカレントディレクトリを起点として表記されるパスを相対パスと呼ぶ。
・ . カレントディレクトリ
・ .. 親ディレクトリ
・ ../.. 親の親ディレクトリ
・ ./home/file-1 カレントディレクトリの下にあるhomeディレクトリの中にあるfile-1を示す
プロセス: Linuxカーネルから見た処理の単位。
ジョブ: シェルから見た処理の単位。
コマンドを3つパイプした場合、プロセスは3つなのに対し、ジョブは1つ。コマンドラインに入力している1つの行が1つのジョブ。
/dev/null 入力先として指定しても何も返さない。出力先として指定しても書き込んだデータは消えて無くなる。標準エラーメッセージだけは画面に表示される。コマンドの表示結果が大量にある時に使うと便利。
パイプライン: コマンドの標準出力を別のコマンドの標準入力につなぐ。lsコマンドの表示結果をlessコマンドで見るなど。
複数のファイルやディレクトリをまとめたファイルをアーカイブファイルと呼ぶ。
それを圧縮したものを圧縮ファイルと呼ぶ。
便利な操作方法
Ctrl + k カーソル位置から行末までを削除する
Ctrl + u カーソル位置から行頭までを削除する
Ctrl + y 最後に削除した内容を挿入する
Meta + b 一つ前の単語に移動
Meta + f 一つ後の単語に移動
Ctrl + s キー入力を受け付けなくする
Ctrl + q キー入力を再開する
Ctrl + c 実行中のコマンドを強制終了する
Ctrl + l 画面をきれいにする/clearコマンドと同じ
reset Ctrl + lでも文字化けが直らない時にやってみる
tabキーを2回 候補のコマンドを全て表示することができる
Ctrl + r インクリメンタル検索をすることができる
Ctrl + g 検索結果を破棄してプロンプトに戻る
Linuxコマンド集
pwd カレントディレクトリを確認する
ls /usr usrディレクトリ内のファイル一覧を表示する
ls /usr /tmp usrディレクトリとtmpディレクトリ内のファイル一覧を表示する
ls -l ファイル名だけでなくファイル属性などの詳細情報を一緒に表示する
表示された最初の文字がdならディレクトリ、-なら通常ファイルと覚えておこう。
ls -a 隠しファイルも含めて表示する。基本的にはlsだけだと.から始まるファイル名は表示されない。
ls -F ファイル種別を含めて表示する。なし:通常ファイル, /:ディレクトリ, *:実行可能ファイル, @:シンボリックリンク
ls -a -F / このようにオプションを2つ重ねて、さらに/という引数を取ることもできる。
ls -w 30 30桁で表示する
ls --quote-name ファイル名を""で囲んで表示する
mkdir work workディレクトリを作成する
mkdir -p report/2014/01 -pオプションをつけることで、一気に階層の深いディレクトリを作成することができる。
touch ファイル名 新しいファイルを作成する。
touch file1 file2 複数のファイルを一度に作成可能
rm ファイル名 ファイルを削除する
rm file1 file2 複数のファイルを一度に削除可能
rm *.html 拡張子.htmlのファイルを一度に削除できる
rm file* fileとつくファイルを一度に削除することができる
rm -r ディレクトリ名 ディレクトリとその下のファイルを全て削除する
rm -i ファイル名 削除確認をしてくれる
rmdir 空のディレクトリを削除する。中身がある場合はエラーになる
cat /etc/hosts /etc/hostname hostsとhostnameというファイルの中身を表示する
cat -n ファイル名 行番号付きでファイルの中身を表示する
catコマンドを引数抜きでenterするとキーボードからの入力を表示するモードに変わる。それを終了させたい時はCtrl + dを押す。
less ファイル名 指定したファイル名を1画面いっぱいに表示することができ、上下にスクロールできる。catコマンドだと1画面に収まり切らなそうな時に使う。
cp file1 file2 file1をfile2という名前でコピー
cp file1 file2 file3 dir2 3つのファイルをコピーしてdir2というディレクトリに入れる
cp *.txt backupdir 拡張子.txtのファイル全てをbackupdirにコピーする
cp -i file1 file2 もしディレクトリ内にfile2が既に存在している場合だけ、上書きしていいか確認してくれる
cp -r dir2 dir3 dir2を中身も含め全てdir3としてコピーする
cp -r dir2 dir3 既にdir3があった場合は、dir2が中身ごとdir3の下に配置される
mv file1 file2 file1をfile2という名前に変える
mv file1 dir1 file1をdir1に移動する
mv file1 file2 file3 dir1 3つのファイルをdir1に移動する
mv -i file1 file2 既にfile2が存在している場合は上書きして良いか確認してくれる
mv dir1 dir2 dir1の中身ごとdir2の中に移動させる
ln file1 file2 ハードリンクを作成する。別のコマンドでfile2を指定するとfile1にアクセスできるようになる。例えばcat file2とするとfile1の中身が表示される。つまりファイルに別名をつけるコマンド。
ln -s file1 file2 シンボリックリンクを作成する。ls -lでファイルにシンボリックリンクがあるかどうか確認できる。
ln -s dir1/dir2 syouryaku このように深い階層にあるディレクトリにシンボリックリンクを付けておくとすぐに移動することができる。
unlink syouryaku シンボリックリンクを消すことができる。syouryaku/では消えないのでご注意。
find . -name file1.txt -print カレントディレクトリの下にあるfile1-txtというファイルのパスを全て表示する。
find . -iname file1.txt -print 大文字小文字の区別なく検索する
find . -name '.txt' -print カレントディレクトリ下にある拡張子が.txtのファイルを全て表示する(必ずか?を使う時は''で囲むこと)
find . -type d -print カレントディレクトリ下にある全てのディレクトリのパスを表示する(d:ディレクトリ, f:通常ファイル, l:シンボリックリンク)
find -type f -a -name 'file*' -print カレントディレクトリ以下の通常ファイルでfileとつく名前のパスを全て表示する。-aはANDを意味し複数の検索条件を指定することができる。
locate 文字列 任意の文字列を含むパス名を全て表示することができる。カレントディレクトリではなく、ルートディレクトリ下から検索される。(locateコマンドをインストールしてupdatedbコマンドを事前に打つ必要がある)
locate -i FiLe1 大文字小文字関係なくfile1とつくパスを全て表示する
locate -b file1 -bとつけるとファイルに絞って検索することができる。ディレクトリは検索されない。
locate file1 file2 file1かfile2どちらかの名前が含まれているパスを全て表示する
locate -A dir2 file1 dir2とfile1どちらの名前も含まれているパスを全て表示する
コマンド --help そのコマンドの使用を表示する
which コマンド コマンドを入力する時、シェルが実際にどのファイルを実行するかを確認する
alias 名前='コマンド' 長いコマンドにエイリアスを設定することができる
type コマンド名 エイリアスの場合どのコマンドのエイリアスなのかを表示してくれる
unalias エイリアス名 エイリアスを削除する
/bin/ls コマンドのフルパスを指定すると、一時的にエイリアスを無効にしてコマンドを実行することができる
command ls 同じくエイリアスを一時的に無効にできる
\ls 上と同じ。バックスラッシュはoption + ¥
set
shopt bashの設定を変更できる。p134
var1='test variable' シェル変数を設定。値に空白が入る時は''で囲む必要がある。変数を設定する時に=の左右にスペースをつけてはいけない。
echo $var1 $変数名という形で参照することができる。
PS1='任意の文字列' プロンプトに表示する文字を設定することができる
PS1='[yokotabash] \w \$ ' このようにするとカレントディレクトリを追加で表示してくれる。\wがカレントディレクトリを指す。さらに詳しい設定方法はp137
printenv 現在シェルに設定されている環境変数を表示する
source ~/.bashrc ファイルの内容を読み込んで実行できる。この場合、.bashrcファイルの設定を即座に反映させることができる。
ls -ld dir1 ディレクトリのパーミッションを確認する
chmod [ugoa] [+-=] [rwx] <ファイル名> 権限を与えるコマンド。u:オーナー, g:グループ, o:その他のユーザー, a:ugo全て
chmod 8進数の数値 <ファイル名> 元のパーミッションに関わらず新しいパーミッションの値へと変更する。r:4:読み取り, w:2:書き込み, x:1:実行となる。 p158
su スーパーユーザの略。一般ユーザでログインしてる時に、一時的にスーパーユーザとして作業したい時にsuと打つ。スーパーユーザとして作業を終えたら、exitコマンドで元の一般ユーザに戻ることができる。
su - 環境変数などをスーパーユーザのそれに初期化してユーザを切り替えることができる。
sudo 別のユーザとしてコマンドを実行するために利用される。つまり一般ユーザでログインしてる時に、スーパーユーザでないと実行できないコマンドを実行するために使う。sudoの場合、実行したコマンドが終了すれば元の一般ユーザに自動的に戻る。ちなみにパスワードは今ログインしているユーザのパスワードを入力する。ユーザにsudoコマンドを許可するかは/etc/sudoersファイルに管理されている。(sudoersファイルを編集する時はp163,164を必ず読む)
ps 現在動作しているプロセスを表示する。(プロセスとは実行中のプログラムのこと)
ps xf 現在のユーザが実行中の全てのプロセスを表示
ps ax システムで動作している全てのプログラムを表示する。Linuxはマルチタスク機能で様々なプログラムが同時に動作している。(psコマンドのオプション一覧はp171)
Ctrl + z 起動しているジョブを停止状態にする
jobs 現在のジョブを確認する
jobs -l プロセスIDも一緒に表示する
fg %ジョブ番号 そのジョブを再開する
bg %ジョブ番号 そのジョブをバックグラウンドにする
kill %ジョブ番号 ジョブを終了させる。ジョブが終了すると、Terminatedというメッセージが表示される。
kill PID 同じくプロセスを終了させる。psコマンドでPIDを確認する。
cat < /ect/crontab キーボードの代わりにファイルを標準入力につないでいる。結果はcatコマンドを普通に打った時と同じだが、入力リダイレクトの場合は、標準入力をそのまま標準出力しているのに対し、普通のcatコマンドの場合は「ファイル名が指定された場合はその内容を対象にする」という用意された動作をしている。
ls -l > list.txt 標準出力先を画面ではなくlist.txtというファイルに変更している。
ls /xxxxxx 2> list.txt list.txtに標準エラー出力先を変更している。
ls /xxxxx > list.txt 2> error.txtというように書くことも可能。
ls /xxxx > result.txt 2>&1 標準出力をリダイレクトした後に、2>&1と書くと標準出力と標準エラー出力をまとめて1つのファイルにリダイレクトできる。
echo >> number.txt ファイルを上書きせずに、ファイル末尾に追記するようにする
ls -l | less パイプラインでlsコマンドの表示結果をlessで画面に表示できる
history ~/.bash_historyというファイルに保存されてあるコマンドライン履歴を表示することができる。
histroy | less 上記と同じ。
ls -l | cat -n | less パイプラインで3つのコマンドをつなげている。ただパイプラインは標準出力しか次のコマンドに繋げられないので、ls -l / /eeee 2>&1 | lessこのように書く必要がある。
ちなみに、catコマンドのように標準入力を入力として受け取り、標準出力に出力するコマンドのことをフィルタと呼ぶ。
head ファイルの先頭から10行を表示するコマンド。
head -n 3 ファイルの先頭から3行を表示する。
tail headコマンドの逆で末尾を確認することができる。
du -b ファイルorディレクトリ そのファイルのバイト数を表示する。
sort ABC順に並べ替える。
sort -n 数値順に並べ替える。
tac 入力行の順序を逆にして表示する。
du -b /bin/* | sort -n | tac バイト数が小さい順に並べる。
wc 入力ファイルの行数、単語数、バイト数を表示する。(左から)
wc -l 行だけ
wc -w 単語だけ
wc -c バイト数だけ
ls . | wc -l カレントディレクトリ直下のファイル、ディレクトリ数を数える。
ps | sort -k 4 縦の列の4行目を基準に並び替える
sort -r 逆順に並べる
ls -l . | sort -rn -k 6 カレントディレクトリ直下のファイルとディレクトリを縦6行目の数値を基準にして逆順で表示する。
uniq 同じ内容の行が連続している場合、重複を取り除く。
sort file | uniq 重複している要素が離れている場合は、一旦sortコマンドで調整してからuniqをすれば良い。uniqコマンドを使う時は常にsortコマンドとセットで使うことを念頭に。
sort -u file 重複行を取り除いて順番を揃える。sort file | uniqよりこっちの方が良さそう。
uniq -c 重複行を数えてその数を教えてくれる
sort file1.txt | uniq -c | sort -rn file1の重複行を数えて、重複が多い順に並び替えて表示する。
cut -d : -f 7 /etc/passwd :を区切り文字にして7つ目のフィールドを表示する。
cut -d : -f 1,6,7 /etc/passwd このように複数のフィールドを指定することも可能。
tr abc ABC 文字を置き換える。aはAに。bはBにという感じ。あくまでも1文字単位の文字変換。文字列の置き換えは別のコマンドを利用する。trコマンドはファイル名を指定してもエラーになる。なので、catコマンドを使うか、tr a b < ./file1.txtのようにリダイレクトさせる。
tr -d 消したい文字 -dをつけると指定した文字を削除して表示することができる。消したい文字の部分に\nを指定すると、改行を取り除いて1行で表示することができる。
tail -f ファイル名 ファイルの内容が書き換えられると、追記された内容を表示する
diff 比較元ファイル 比較先ファイル ファイルの差を表示する。
diff -u 比較元ファイル 比較先ファイル ユニファイド形式で表示する。githubみたいな感じ。
grep 検索パターン ファイル名 そのファイルから検索パターンに一致する行を出力する。
grep -n 検索パターン ファイル名 マッチした行の行番号を一緒に表示する
grep -i 検索パターン ファイル名 大文字小文字を区別しないでマッチさせる
grep -v 不要なワード ファイル名 不要なワードを除いてファイルの内容を表示させる
ls / | grep word ファイル名を指定しない場合、標準入力から読み込ませることができる。
ls | grep '^file' fileという文字から始まるディレクトリまたはファイルを表示する。
正規表現を使用する場合は''で囲む必要あり。
grep 't.st' example.txt tで始まりstで終わる4文字のワードを検索する。.は任意の1文字という意味がある。
.そのものを検索したい時は、ドットの前に\を付ける。
.ではなく、[]に含まれるいずれかの1文字。
[^文字][]の中に含まれないいずれかの1文字。
grep 'file[1-3]' number.txt file1,file2,file3があれば表示する
grep 'file[^13]' number.txt fileがついて、file1,file3,file13以外を表示する
grep '^txt' file1.txt 先頭がtxtで始める行のみを抜き出す。.txtなどは除外できる。^は行頭を意味する。
grep 'txt$' file1.txt 行末がtxtとつく行のみを抜き出すことができる。$は行末を意味する。また、^$は空行を意味する。-vオプションを使って空行だけを除いて表示することができる。
- 0回以上の繰り返しを表すメタ文字 grep 'be*r' txt.html brやber,beerなどが表示される。 grep 'b[ea]*r' txt.html br,bear,beerなどが表示される。
.* 任意の文字が0回以上繰り返されているという意味。あらゆる文字列にマッチする。
grep '^ex.*txt$' file.txt exで始まってtxtで終わる行を全て表示する。
拡張正規表現 基本正規表現よりも使えるメタ文字を増やしたもの。-Eオプションをつけて使う。
- 拡張正規表現のメタ文字。直前の文字の1回以上の繰り返しを意味する。 grep -E 'be+r' txt.html ber,beer,などが表示される。
? 拡張正規表現のメタ文字。直前の文字の0回または1回の繰り返しを意味する。
grep -E 'be?r' txt.html br,berが表示される。
{m,n} 拡張正規表現のメタ文字。直前の文字のm回以上n回以下の繰り返しを意味する。
grep -E 'be{1,2}r' txt.html ber,beer,beerbeerなどが表示される。
{m} 拡張正規表現のメタ文字。直前の文字のm回の繰り返しを意味する。
grep -E 'be{1}r' txt.html berが表示される。
[0-9]{3}-[0-9]{4}とすると郵便番号の桁のチェックなどができる。
{m,} 拡張正規表現のメタ文字。直前の文字のm回以上を意味する。
(文字) 拡張正規表現のメタ文字。単語をグループするためのメタ文字。
grep -E '(wine){2,}' txt.html wineという文字が2回以上繰り返されるものを表示する。
abc|xyz 拡張正規表現のメタ文字。複数の単語をOR条件でつなげるメタ文字。多くの場合は()とセットで使われる。
grep -E 'my(water|wine)' txt.html mywater,mywineが表示される。
sed 1d txt.html txt.htmlの1行目を削除したものを表示する。sedは元のファイルを上書きすることはない。sedは非対話型エディターである。1の部分をアドレスと呼ぶ。
sed 1,5d txt.html txt.htmlの1~5行目までを削除したものを表示する。
sed '3,$d' txt.html txt.htmlの3~最終行までを削除したものを表示する。アドレスに$を指定すると最終行を意味する。
sed d txt.html txt.htmlの全ての行を削除する。アドレスを省略すると、コマンドは全ての行に作用する。
sed /^b/d txt.html txt.htmlの先頭がbで始まる行を削除したものを表示する。アドレスに正規表現を使う時は/で囲んであげる。
sed 1p txt.html txt.htmlの1行目を表示する。+パターンスペースを表示する。
sed -n 1p txt.html パターンスペースを除いて1行目だけ表示する。
sed 's/beer/whisky/' txt.html txt.htmlのbeerという単語をwhiskyに置換したものを表示する。ただ、beerbeerはwhiskybeerという風にしか変わらない。行頭から探して最初に見つかった文字列だけを置換する。
sed 's/beer/whisky/g' txt.html 見つかった全ての文字列を置換するにはgフラグを付ける。これで、txt.htmlのbeerという単語全てがwhiskyに置換され、それが表示される。
sed 's/b.*r/whisky/g' txt.html txt.htmlのbで始まりrで終わる単語全てをwhiskyに置換したものを表示する。
sed 's/b//g' txt.html 置換後の文字列を指定しないことで、txt.htmlのbを全て削除している。
sed -n 's/b//gp' txt.html 置換が発生した行だけ表示している。-nオプションでパターンスペースを非表示にし、pフラグで置換が発生した部分だけ表示できる。
sed -r 's/be+r/whisky/' txt.html sedで拡張正規表現を使うには-rを指定する。
sed -r 's/my(.*)/--\1--/' txt.html ()でグループ化して\1でそれを参照することができる。この場合、myappleが--apple--と置換される。
sed '1,2s/beer/whisky/g' txt.html txt.htmlの1~2行目の範囲でbeerをwhiskyに置換したものを表示する。
/という文字そのものを指定するには、\/と表記する。もしくは
sed 's!beer!/beer/!g' txt.htmlというように区切り文字を/から!に変えて書く。
ls -l | awk '{print $5,$9}' lsコマンドで表示される行の5と9行だけを表示する。ちなみに1~9行目までの全ての列を指定するには$0とする。
ls -l | awk '{print $5$9}' 表示されるレコードが空白で区切られてないものになる。
$NF awkで使う組込変数。$NFをprintすると最後のフィールドが表示される。
ls -l | awk '{print $(NF-1)}' 最後から2番目のフィールドが表示される。
ls -l | awk '$9 ~ /^fi/ {print $5,$9}' 9個目のフィールドで、先頭がfiで始まるレコードに対して、5と9フィールドを表示する。正規表現との比較は~を使用する。正規表現のパターンは//で囲んで指定する。
ls -l | awk '/^d/ {print $5,$9}' 比較対象を指定しないと、レコード全体が比較対象になる。
ls -l | awk '/^d/' アクションを省略すると{print $0}が実行される。この場合、フィールド全体でdから始まる全てのレコードを表示する。
awk -F, '{sum += $NF} END{print "Average:",sum/NR}' score.csv まず、-F,でフィールド全体の区切り文字を空白から,に変更する。次にsumという変数を作成し、そこに全員の点数を足していく。ENDブロックに書かれた処理は最後に実行される。NRは行数を取得できる組込変数。合計点をレコードの行数で割って平均点を出すことができる。
cat average.awk
=> {sum += $NF} END{print "Average:",sum/NR}
awk -F, -f average.awk score.csv
=> 平均点
上記のように作ったawkスクリプトを.awkファイルに保存して、-fオプションでいつでも再利用することができる。
tar cf dir1.tar dir1 dir1下のディレクトリまたはファイルをdir1.tarというアーカイブファイルにまとめる。cfはcreate fileの略。
tar tf dir1.tar dir1.tarというアーカイブファイルの中身を確認する。tはlistのtらしい。
tar xf dir1.tar dir1.tarファイルを展開して取り出すことができる。xはextractのx。展開されるファイル名と同じファイル名が存在する場合は上書きされてしまうので注意。
tar cvf dir1.tar dir1 cfと一緒に対象になったファイル一覧を表示することができる
tar tvf dir1.tar tfと一緒に、ls -lのようにパーミッションやオーナー、ファイル属性を表示してくれる
注意:rootユーザーではないユーザーがアーカイブを作成すると展開時に読み込み権限がなくファイルを展開できないなどの問題が発生するリスクがある。なのでrootユーザーでやると良い。アーカイブはタイムスタンプなどもそのままコピーするので、バックアップ向き。
gzip ps.txt ps.txtを圧縮する。.gzという拡張子になる。
gzip -d ps.txt.gz 圧縮したファイルを元に戻す。
tar czf dir.tar.gz dir1 これはtarコマンドだけでアーカイブと圧縮を同時に行っている。cfの間にzオプションを挟む。
tar xzf dir.tar.gz 逆にアーカイブされ、圧縮されたファイルを展開して取り出している。
ちなみにbzip2というコマンドでもファイルを圧縮できるらしい。gzipよりも圧縮率が高くデータ量も小さくできるが、圧縮や展開に時間がかかる。xzコマンドはさらに圧縮できる。
zipコマンドはアーカイブと圧縮を同時に行う。多くのディストリビューションにはインストールされていないので、使う場合はzipとunzipコマンドをインストールする必要がある。
git log -p コミットごとの差分を含めて履歴を表示することができる。
git diff --cached 次にgit commit したときにリポジトリにコミットされる差分を表示します
上記の記事がgit diffについて詳しく書いてる。
git add -u 変更したファイル全てをindexにあげる。新規作成されて一度もコミットされていないファイルは対象外となる。
git revert コミットid 誤った内容をコミットしたときに、それを打ち消すことができる。ただ、履歴からなくなるわけではなく、打ち消したものをコミットするという流れになる。
git branch -d ブランチ名 ブランチを削除する。
vimの操作
:w ファイルを保存する。新規ファイルの場合はファイルを作成。既存ファイルの場合は上書き保存をする
:w ファイル名 名前をつけて保存する
:q! 上書き保存せずにvimを終了する
h 左に移動
j 下に移動
k 上に移動
l 右に移動
x カーソルより右側の文字を削除する
i insertモードに変える(カーソルの左側に文字)
a insertモードに変える(カーソルの右側に文字)
w 次の単語の先頭に移動する
b 後ろの単語の先頭に移動する
W スペース区切りで次の単語へ
B スペース区切りで後ろの単語へ
0 行の先頭に移動
$ 行の末尾に移動
gg ファイルの最初の行に移動
G ファイルの最後の行に移動
20G ファイルの20行目に移動
d$ 行末までをデリート
d0 行頭までをデリート
dl 1文字デリート
dw 単語1つをデリート
dgg 最初の行までデリート
dG 最後の行までデリート
ヤンクの場合はdがyに置き換わる
yy カーソルのある1行をコピーする
dd カーソルのある1行をデリートする
J カーソルのある行と1つ下の行を連結させる
u 直前の編集操作を取り消す(アンドゥ)
Ctrl + r アンドゥを取り消すことができる(リドゥ)
/文字列 任意の文字列を検索してマーカーをつける
n マーカーがついた状態の次の単語に移動する
N マーカーのついた1つ前の単語に移動する
:noh ハイライトを消す
:%s/置換前/置換後/g 文字列の置き換えをする
iTerm2の便利コマンド
Command + D→ウインドウを左右に分割する
Command + Shift + D→ウインドウを上下に分割する
Command + n→新しいウインドウを作成
Command + f→検索
Command + t→新しいタブを作成
Command + T→タブを複製する
Command + W→タブを削除する
Command + 矢印キー→タブを移動する
Command + Enter→全画面を表示させる
Command + [→次のウインドウへ移動
Command + ]→前のウインドウへ移動
シェルスクリプト
簡単なファイルの作り方
#!/bin/bash
du -h ~ | tail -n 1
からの
$chmod +x homesize.sh
$ ./homesize.sh
これでシェルスクリプトを実行することができる
1行目のやつはシバンもしくはシェバンと呼ばれ、/bin/bashで以下のコマンドを実行するよーっていう意味。
また、1行目を書かずに、sourceコマンドや.でファイルの中身を実行することもできる。
シバンをつけるとサブシェルで実行されるので、元のシェルには影響を及ぼさないが、sourceや.コマンドでは元のシェルに影響を及ぼす。
また、複数のコマンドを;で区切ることで1行で書くことができる。
#!/bin/bash
echo "root directory";cd /;ls -l
コマンドが1行に収まらなそうなら、\を使うことで改行できる。
シェルスクリプトではシェル変数というものを使うことができる。
シェル変数を参照するには$変数名とする。
#!/bin/bash
comment="Ruby on Rails"
echo $comment
こんな感じで変数を参照するよ。
変数に続いて文字列をechoしたいなんて時は
#!/bin/bash
comment=Ruby
echo ${comment} on Rails
こんな感じで${変数名}とすると良い
また、文字列ないでシェル変数を使うには""で囲まなくてはいけない。Rubyと同じ。
#!/bin/bash
comment=Ruby
echo "$comment on Rails"
コマンドの結果をシェルスクリプトで使いたい時は、$()の中にコマンドを書く。その結果を文字列として取得することができる。
#!/bin/bash
comment=$(date '+%Y-%m-%d')
echo "today is $comment"
こんな感じ。
こんな書き方もできる
#!/bin/bash
echo "today is $(date '+%Y-%m-%d')"
位置パラメーターを使う
#!/bin/bash
echo $1
echo $2
上記のファイルがある状態で、
$ ./example.sh Ruby PHP
とすると、
./example.shが$0
Rubyが$1
PHPが$2
となり、
Ruby
PHP
と出力される。
引数の個数を取得するには$#と書けば良い。
#!/bin/bash
echo $1
echo $2
echo "vars $#"
引数を分割せずに使うには、$@か$*を使う。
#!/bin/bash
echo $@
echo $*
この状態で./example.sh hello worldとするとhello worldと出力される。
$@は一つ一つの引数がそれぞれ展開されていく。
$*は複数の引数を1つの引数ととらえる。
if文を使ってみる。
#!/bin/bash
if [ "$1" = "bin" ]; then
echo "ok"
else
echo "ng"
fi
第一引数がbinという文字列ならokを出力する。
終了ステータスとは、
例えばlsを打って正常に動作した場合は、
$echo $?
で終了ステータス 0を取得することができる。
エラーになってしまった場合は、0以外の数値を取得する。
[ 条件式 ]はtestコマンドで代用できる。
if test "$1" = "bin"; then
echo "ok"
else
echo "ng"
fi
こんな感じ。
評価演算子はp292あたりに。
for文の使い方
for 変数名 in リスト
do
繰り返す処理
done
詳しくはp300くらい