shellメモ

Ctrl+r
入力履歴から後方検索
Enter
検索したものを実行
Ctrl+g
検索を中止


Ctrl+a
行頭へ移動
Ctrl+e
行末へ移動
Ctrl+u
カーソルから行頭の文字列を切り取り
Ctrl+k
カーソルから行末の文字列を切り取り
Ctrl+y
ペースト
Alt+f, Alt+b
単語単位で移動


ファイル名を指定してその中身を置換

find . -name \*.py | xargs sed -i "" "s/foo/bar/g"


history番号を指定して実行 !<番号>


特定のディレクトリを除外してzip
zip -r foo.zip foo_dir -x bar/**\/* hoge/**\/*

名前つきパイプ
<(コマンド)はコマンドの出力結果を持つ擬似ファイルのパスに置き換わる。

cd -は直前のディレクトリに移動する

cp foo{,.txt}cp foo foo.txtと同じ

(コマンド)はサブシェルで親シェルの環境変数やカレントディレクトリを変更しない

$変数名で展開

`who`${who}whoが実行される
単なる変数はシェルのプロセス内でのみ利用することができる
環境変数はシェルから生じたプロセスから利用することができる
export 変数名で変数名を環境変数にすることができる

alias foo='git status'

関数の引数 $1, $2

for

for a in cat foo.txt; do echo $a; done
for a in *.txt; do echo $a; done
for a in a b c; do echo $a; done
for ((i = 0; i < 5; i++)); do echo $i; done
for ((i = 0; i < 5; i++)); do echo $i; done > file_name

while [$i -lt 0]
do
   ...
done

until [$i -lt 0]
do
   ...
done

if

if [ -e file_name ] then
   ...
elif [-d foo ]
   ...
else 
   ...
fi

-e A Aが存在している
-d A Aがディレクトリ
string1 = string2 文字列が等しい
string1 = string2 文字列が異なる
-gt -ne -ge -lt -le -eq 数値の比較
-a AND
-o OR
(条件) 条件のグループ
&& ||

.bash_profileは起動時に読み込まれる環境変数の定義
.bashrcはシェルの起動時に読み込まれる
sourceで反映する
export HISTCONTROL=ignoredupsで重複している履歴を保存しない
export HISTSIZE=2000で履歴を2000件保存する
export HISTFILESIZE=2000で2000行分の履歴を保存する

'"で囲まれた文字列は展開しない

foo=bar
echo $foo
// => bar
echo ${foo}hoge
// => barhoge
// 値があるかどうか
echo ${a:-b}
// => b
a=c
echo ${a:-b}
// => c
a=
echo ${a:=b}
// => b
echo ${a:=c}
// => b
echo ${a:+c}
// => c
a=
echo ${a:+c}
// =>
a=b
echo ${a:?ABC}
// => b
a=
echo ${a:?ABC}
ABC
// 後ろから文字列を取り除く
a=1a2a3
echo ${a%a*}
// => 1a2
echo ${a%%a*}
// => 3
// 前から文字を取り除く
echo ${a#*a}
// => 2a3
echo ${a##*a}
// => 3


文字列の長さ ${#foo}

ファイルディスクリプタ

標準入力 0
標準出力 1
標準エラー出力 2

bar.txtと標準エラー出力をつなげる
foo 2> bar.txt
foo 10< bar.txt 80> hoge

標準エラー出力の出力先を標準出力にする
foo 2>&1
下記の2つは同じではない
foo 1> bar 2>&1
foo 2>&1 1> bar


exit <終了ステータス> 処理をやめる exec コマンドの起動、標準入力と標準出力の切り替え
trap シグナルハンドラの登録