Linux Shellでよく使うコマンド集
一時停止する
- [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}
シンボリックリンクを作成
ln -s ${dir_pass} <作成するリンク名>