Linux Shellでよく使うコマンド集

4 min read読了の目安(約3900字

一時停止する

  • [Enter]以外では進まない
  • メッセージは出ずに実行だけ止まるので、直前でechoするといい
echo "続けるにはEnterを入力してください"
read Wait

if文

if <条件式> ; then
	# 条件式がtrueのとき実行
elif <条件式> ; then
	# 条件式がtrueのとき実行
else
	# どちらもfalseのとき実行
fi

等しいか判定

[ の前後にはスペースを入れないとエラー

# valが数値のとき
if [ 1 -eq $val ] ; then
...(省略)

# valが文字列のとき
if [ "aaa" = $val ] ; then

等しくないことを判定

# valが数値のとき
if [ 0 -ne $val ] ; then
...(省略)

# valが文字列のとき
if [ "aaa" != $val ] ; then

shellの引数チェック

引数が1つ必要な場合

test.sh
# $# 引数の個数
# $0 実行したshファイル名
if [ $# != 1 ]; then
	echo "ex. sh $0 ファイル名"
	# => ex. sh test.sh ファイル名 と出力
	exit 1
fi

whileループ

while <条件式>; do
	# 条件式がtrueの間ループ
done

無限ループ(止めるときは [Ctrl] + C)

while true; do
	echo "1秒待ってループ"
	sleep 1
done

コピー

ファイルのコピー

cp ${src_pass} ${dest_pass}

ディレクトリの中身ごとコピー

cp -r ${src_pass} ${dest_pass}

ファイルの削除

rm ${file_pass}

ディレクトリの場合

rm -r ${dir_pass}

ファイルの検索

1ファイルだけ探す

if [ -e ${file_pass} ]; then
	echo "ファイルがありました"
fi

if [ ! -e ${file_pass} ]; then
	echo "ファイルがありません"
fi

圧縮・解凍する

zipのコマンドがある場合

# 圧縮
zip xxx.zip <ファイルやディレクトリ>

# 解凍
unzip xxx.zip

アーカイブ=複数ファイルを1ファイルに固める(無圧縮)

tar -cf xxx.tar <ファイルやディレクトリ>

# 実行時にアーカイブしたファイルを出力する
tar -cvf xxx.tar <ファイルやディレクトリ>

# 展開
tar -xvf xxx.tar

# 展開先を指定
tar -xvf xxx.tar -C <展開先のディレクトリ>

圧縮する(実際はアーカイブ化→圧縮を順に行っている)

tar -jcf xxx.tar.bz2 <ファイルやディレクトリ>

# 実行時に圧縮したファイルを出力する
tar -jcvf xxx.tar.bz2 <ファイルやディレクトリ>

# 解凍
tar -jxvf xxx.tar.bz2

エスケープする

基本的にダブルクォート("aaa")を使えばOK

記号一覧

名前 記号 入力方法 動作
ダブルクォート " Shift + 2 $、バッククォート、バックスラッシュ以外をエスケープ
シングルクォート ' Shift + 7 全部エスケープ
バックスラッシュ / / 1文字だけエスケープ
バッククォート ` Shift + @ コマンドとして実行する。※エスケープ文字ではない
str = "abc"

# ダブルクォート
echo "${str}"
# => abc

# シングルクォート
echo '${str}'
# => ${str}

コマンドの実行結果を変数に入れる

コマンドを ` (バッククォート)で囲む

# xxx.txtがあるディレクトリ名を取得
dir_name=`dirname */xxx.txt`
echo $dir_name

ディレクトリ内のファイル数をカウントする

ls -1 | wc -l

テキストファイルの操作

ファイルの中身を出力

全部出力

# ファイルの中身が一行だけで改行なしの場合、改行が出力されないので注意
cat ${file_pass}

最後の数行だけ出力(ログファイルとかに使う)

tail ${file_pass}

ファイルが更新されたら出力し続ける(止めるには [Ctrl] + C)

tail -f ${file_pass}

(複数ファイルがあるとき)最後に更新されたファイルの中身を見る

# 取得したいファイルがあるフォルダへ移動してから実行
ls -t | head -n 1 | xargs tail -f

viで編集する

vi ${file_pass}

操作方法

  • [ESC]でコマンドモードになる
  • 終了
    • :q:保存せずに終了
    • :wq:上書き保存して終了(書き込み可能状態でないとエラー)
  • 編集する
    • :i:編集モードに変更
    • x:1文字削除

テキストファイルの中身を検索する

if grep -q 'str' ${file_pass}; then
	echo strがあります
fi

# 正規表現
if grep -E '^str$' ${file_pass}; then
	echo strのみの行があります
fi

テキストファイルの中身を書き換える

一致する文字列を置換する

# 置換後のファイルを別名保存
sed -e 's/置換対象の文字列/置換後の文字列/g' test.txt > test_new.txt

# 置換後のファイルを上書き保存
sed -i -e 's/置換対象の文字列/置換後の文字列/g' test.txt

一行挿入する

最終行に追加&改行

echo 'hoge'>> test.txt

行指定で追加

sed -e '行番号i 挿入する文字列' test.txt > test_new.txt

# 例(3行目にhogeを挿入)
sed -e '3i hoge' test.txt > test_new.txt

shell実行時にコマンドをすべて出力する

Windowsのコマンドプロンプトの @echo on みたいな

set -x
# 以降はコマンドが出力される

出力をやめるとき

set +x

shellを1行ずつ実行する

set -x
trap read debug

# 以降は一行ずつ実行

実行権限をつける

shとか

chmod +x ${file_pass}

パーミッションの変更

数値でも指定できるがここでは文字列指定を記載

「アクセスクラス」+「演算子」+「アクセス型」の組み合わせで指定する

アクセスクラス 名前
a 下記すべて
u ユーザ
g グループ
o その他

rwxr-xr-- はユーザ、グループ、その他の順に3つづつ並んでいる。

  • rwx:ユーザに全権限を与える
  • r-x:グループに読み込みと実行権限を与える(書き込みは不可)
  • r--:その他は読み込みのみ
演算子 意味
= 指定するアクセス型に指定
+ 指定するアクセス型を追加(権限を与える)
- 指定するアクセス型を除外(権限を除く)
アクセス型 意味
r 読み込み権限
w 書き込み権限
x 実行権限

例:-rwxr-xr-x にしたいとき

# 全部r-xにして、ユーザにだけwを追加
chmod a=r-x,u+w test.txt

シンボリックリンクを作成

ln -s ${dir_pass} <作成するリンク名>