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.