Paepoi

Paepoi » ShellScript Tips » ShellScript Tips | 覚書色々

ShellScript Tips | 覚書色々

# 最終更新日 2020.09.13

コメントと複数行コメント
#!/bin/sh

#echo シャープを先頭に置けば普通のコメント
: echo コロン+スペースを先頭に置いても何もおこらない

: << __HEREDOC__
    コロンとヒアドキュメントで強引に複数行コメント
    複数行をコメントアウトする正攻法手段は無いので
    エディタでの色分けは期待してはいけません
    Atom や Visual Studio Code なら色分けしてくれる
__HEREDOC__

output="""
    Python 風、変数名は他で使わないという条件で
    実はダブルクォートは一つでいい、察してね
"""

output='
    勿論シングルクォートでもイケる
    Gedit で色分けできるメリット、しかないけど
'''

echo 何もおこりませんでした

ヒアドキュメント
#!/bin/sh

# リダイレクトしたい場合は
# cat << __EOS__ >> output.txt

func() {
    echo バッククォートで関数も使える
}
shstr=シェルスクリプト
hdstr=ヒアドキュメント

cat << __EOS__
${shstr}で${hdstr}のサンプル
最初の改行は無視される、最後は echo や cat が改行する
エスケープ文字 \\ は有効
記号は \$ と \` (バッククォート)を除いて '"{[(<+-=_~!@#%^&*/ は普通に使える
`func`
__EOS__

ヒアドキュメントのインデント
#!/bin/sh

# <<- を使います

for n in 1 2 3; do
	cat <<- __EOS__
	$n: インデントしないと見栄えが気になる
	という神経質な人向け
	インデントは必ず \t で行ってください
	__EOS__
done

コマンドの実行はするけど結果の出力はしない
#!/bin/sh

echo 出力されない > /dev/null 2>&1
# 実行はされていることの確認
gnome-terminal > /dev/null 2>&1

コマンドの存在を確認してから実行
#!/bin/sh

# 各自で書き換えしてね
cmd=gnome-terminal

if type $cmd > /dev/null 2>&1; then
    $cmd
else
    echo $cmd コマンドは存在しません
fi

Windows から持って来たファイルの変換
#!/bin/sh

# iconv で /usr/lib64/gconv にあるライブラリ同士は全部変換できる
# しかし iconv だけでは改行コードを LF に変換してくれない
# dos2unix は utf-8 の BOM 外しにも使える

iconv -f CP932 -t UTF-8 932.txt | dos2unix > utf8.txt

# CR を削除するだけならこんな方法もある
# macOS には dos2unix は無いのでこちらを
tr -d '/r' < cr_lf.txt

キッチンタイマー
#!/bin/sh

# カップラーメン用にどうぞ

# bash
read -p '完成までの残り時間を秒で指定: ' count
# zsh
#read count\?'完成までの残り時間を秒で指定: '

echo 止めるには Ctrl+C

while (( count > 0 )); do
    printf "残り%02g分%02g秒  \r" $(( count / 60 )) $(( count % 60 ))
    (( count-- ))
    sleep 1
done
echo できあがりぃ~

一覧表作成
ls -l > ファイル一覧.txt
df -h > ディスク一覧.txt
# macOS ではサンドボックスに引っかかる
find / -name "*" > ファイル構造.txt
# macOS には入っていない
tree > ディレクトリツリー.txt

ドットコマンド(source コマンド)
#!/bin/sh

# dot_command というファイルを作る
cat << _EOS_ > dot_command
#!/bin/sh
CHILD=子変数
echo \$OWNER
_EOS_

# 上記に +x パーミッションを与える
chmod +x dot_command

# シェル変数を定義する
OWNER=親変数

echo 普通に実行(サブシェルで動く)
# 親で定義した変数は参照でない
# 親シェルからサブシェルの変数も参照できない
# 環境変数にすればサブシェルからも参照可能

./dot_command
echo $CHILD
#=>
#=>

echo ドットコマンド(このシェルで動く)
# シェルで定義した変数は参照できる
# スクリプト内の変数も参照できる
# source ./dot_command でもいい

. ./dot_command
echo $CHILD
#=>親変数
#=>子変数

デフォルト引数
#!/bin/sh

# ${:-} で指定
# 下記は引数があれば引数を、無ければデフォルト引数を表示
# コロンは無くてもいい

arg=${1:-引数が無いよ}
#arg=${1-引数が無いよ}
echo $arg

数値順ソート
#!/bin/sh

# 先頭が数値なら文字列交じりでもイケる

printf "123\n45\n7\n89" > num.txt
sort -n num.txt
: << __OUTPUT__
7
45
89
123
__OUTPUT__

ユーザーディレクトリ(デスクトップ等)パスの取得
#!/bin/sh

# Linux はドットコマンドで user-dirs.dirs の指定を取り込み
. ~/.config/user-dirs.dirs
echo $XDG_DESKTOP_DIR


# Mac は AppleScript から
desktop=`osascript -e "POSIX path of (path to desktop folder)"`
echo $desktop

間接参照(bash のみ)
#!/bin/bash

# ${!prefix*} 又は ${!prefix@}
# にて該当変数名をブレース展開してくれる
# 又文字列から下記のように変数を参照することもできる

GF_top='心美 文緒 くおえ'
GF_loli='苗 睦 桃子'

echo ${!GF_*}

for gf in ${!GF_*}; do
    for s in ${!gf}; do
        echo $s
    done
done

自作スクリプトの実行時間を計る
#!/bin/sh

# sh でも python でも何でもいい

time python3 hoge.py

マシン情報
#!/bin/sh

# ホスト名
uname -n

# ディストリビューション名 (Linux|Darwin)
uname -s

# カーネルのバージョン
uname -r

# CPU 名 (x86|x86_64)
uname -m

#
# 以下は Linux 専用
#

# ホスト名
cat /etc/hostname
# カーネル名
cat /proc/version
# CPU 名
cat /proc/cpuinfo | grep name

# ディストリビューション名
. /etc/os-release; echo $PRETTY_NAME
#cat /etc/system-release # Fedora 等一部

Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.