#author("2024-02-25T07:52:42+00:00","default:hotate","hotate") #author("2024-05-06T07:41:26+00:00","default:hotate","hotate") #contents &tag(コマンド,シェル,OSX,macOS); * 情報 [#v9553358] - [[Linuxコマンド集 INDEX - Linuxコマンド集:ITpro>http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230573/]] - [[シェルの変数に慣れる>http://www.atmarkit.co.jp/flinux/rensai/shell05/parameter.html]] - [[ジャンル別UNIXコマンド一覧 (*BSD/Linux)>http://x68000.q-e-d.net/~68user/unix/genre.html]] - [[UNIX & Linux コマンド・シェルスクリプト リファレンス>http://shellscript.sunone.me/]] 当サイトは管理人 SUNONE による、UNIX & Linux のコマンドおよびシェルスクリプト(bash)の中~上級者向けリファレンス・サイトです。 - [[シェルスクリプト入門 書き方のまとめ | Memo on the Web>http://motw.mods.jp/shellscript/tutorial.html#normal_var]] "(ダブルクォート)で囲むときは変数が展開され, '(シングルクォート)で囲むときは変数が展開されません - [[Bashの便利な構文だがよく忘れてしまうものの備忘録 #Linux - Qiita>https://qiita.com/Ping/items/57fd75465dfada76e633]] しかしながら他のプログラム言語ではみられない記法があったり、逆に似た書き方もあったりと、混乱しがちなのもシェルスクリプトの特徴かもしれない。いちいちGoogle先生に確認するのもめんどうなので、このページに整理した。 * ファイル処理 [#ge5d0c0c] - [[【FreeBSD】シェルスクリプトでパス文字列からファイル名/ディレクトリ名/拡張子を抽出する>http://www.kishiro.com/FreeBSD/get_filename_in_shellscript.html]] -- ファイル名:${test_path##*/} -- パス名:${test_path%/*} - カレントディレクトリ以下の *.tmp をリストアップして「rm 検索したファイル名」を実行する。 -- [[UNIXの部屋 コマンド検索:find (*BSD/Linux)>http://x68000.q-e-d.net/~68user/unix/pickup?find]] find . -name \*.tmp -exec rm {} \; -- ファイルを検索して、指定期間以上過ぎているものを削除する。 find . -type f -name foo_"*".zip -mtime +7 -exec rm -v -f {} \; - [[find コマンドの -mtime は +1 でも2日前のファイルが対象 - Landscape - エンジニアのメモ>http://sonic64.com/2005-07-06.html]] -- (n + 1) * 24 - [[[Bash] ファイルやディレクトリの存在をチェックする方法>http://sweng.web.fc2.com/ja/program/bash/bash-check-file.html]] if [ -e パス ]; then # 存在する場合 else # 存在しない場合 fi -- ワイルドカードを指定してファイルを確認 if ls *.txt > /dev/null 2>&1 then echo "exists" fi - [[bash ファイルが規定個数以上を削除>http://aspect-sys.co.jp/wordpress/?p=1542]] 考え方: ls -l abc* | wc -l で行数を調べその行数が規定を超えているか調べる。 - [[cut、paste、sort、uniq、head、tail、wcを使ったフィルタコマンド一覧>http://uguisu.skr.jp/Windows/sort_uniq.html]] ファイル内の特定の区間の行だけを表示したい場合、headコマンドとtailコマンドを利用することができます。 例えば、3行目~7行目だけを表示するには、次のように指定します。 $ seq 1 10 | head -7 | tail -n +3 - [[ディレクトリのパスの最後に/を付けてはいけない>https://tex2e.github.io/blog/shell/rm-dir-slash]] ${変数名%パターン} は パターンマッチ演算子 と呼ばれ、 この場合は、変数の値の末尾から見て / にマッチした場合はそれを削除し、残りの部分を返す。 * 変数 [#rbbcee15] - 変数に空白を含む場合、ダブルクォーテーションで囲って参照する。 -- [[空白を含んだシェル変数の代入 | OKWave>http://okwave.jp/qa/q3241312.html]] set w1="$test1" - [[シェルスクリプトでの変数定義 - Qiita>https://qiita.com/tdrk/items/cc2995fd74e659ea948f]] ${VAR:=hoge} 変数 VAR が未定義 or NULL の場合、指定した値 hoge を返す さらに、VAR に hoge が 代入される - [[ShellScriptのダブルクォートとシングルクォートの違い - Qiita>https://qiita.com/cocodrips/items/bb3640a9834c8978d48a]] ダブルクォートの中の変数や式は展開されるのに対して、シングルクォートは展開されません。 - [[<Bash, zsh> シェル変数が定義されているかを判定する方法 - ねこゆきのメモ>http://nekoyukimmm.hatenablog.com/entry/2018/01/21/101828]] -v 変数がセットされてるか? どうか? -n 変数の長さが0でないNonzero lengthか? どうか? -z 変数の長さが0 nzero lengthか? どうか? - [[シェルスクリプトで変数が未定義かを確認する>https://blog.n-t.jp/post/tech/bash-non-zero-variable/]] -n で判定できる。逆は -z。 正確には値のlengthがnon-zeroかという判定をしている - [[環境変数について #Linux - Qiita>https://qiita.com/shinyashikis@github/items/294766d75c2ac633e22d]] 子プロセスから親プロセスへの引継ぎ source コマンドを実行することで、child.sh の内容が同じプロセス上で実行されることになるので、ただしく表示される - [[ドットコマンドと直接スクリプトを実行した時の違い - Webエンジニアの技術メモ 〜PHP、SQL、Linuxなど〜>https://moroto1122.hatenadiary.org/entry/20110517/1305595513]] 直接実行した場合、別シェルが呼び出されますが、ドットコマンドでは実行したシェル(カレントシェル)から呼び出されます * if [#u318842c] - [[if 文と test コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス>http://shellscript.sunone.me/if_and_test.html]] したがって、if 文を記述するときは以下のように「;」(セミコロン)を使用し、1行で「if 条件式」と「then」を記述するようにした方がよい。 if 条件式 ; then 処理 fi * [[日時]] [#j03567e9] - [[日付を取得する - UNIX & Linux コマンド・シェルスクリプト リファレンス>http://shellscript.sunone.me/date.html]] % date '+%Y/%m/%d_%H:%M:%S' backup_dir=`date '+%Y-%m-%d'` - [[Mac の bash で date を使って先月の今日の日付を取ろうとしたらハマった | ウェブル>http://weble.org/2010/09/21/mac-bash-date]] echo `date -v-1m +"%Y-%m-%d"` - [[シェル上で日時をISO-8601形式で出力 - 病みつきエンジニアブログ>http://yamitzky.hatenablog.com/entry/2013/04/16/230706]] date +"%FT%T%z" * 戻り値 [#ea15321b] - [[終了ステータス - UNIX & Linux コマンド・シェルスクリプト リファレンス>http://shellscript.sunone.me/exit_status.html]] コマンドの成否を表す数値が特殊変数 $? に自動で設定される。 一般的にはコマンド成功時には「0」が、失敗時には「1」が設定される。 * 外部スクリプト [#kab2f960] - [[【FreeBSD】どのディレクトリから実行されても動作する入れ子形式のシェルスクリプトを作る>http://www.kishiro.com/FreeBSD/current_directory_free_shellscript.html]] binary_path=`dirname $0` ${binary_path}/child.sh - [[シェルスクリプト - シェル関数>http://www.booran.com/menu/scr/func.html]] 外部ファイルを読み出すには、 . 外部ファイル名 - [[Bash - 初心者向け、「上手い」シェルスクリプトの書き方メモ - Qiita>http://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d]] 実行されている自分自身のディレクトリを取得する script_dir_path=$(dirname $(greadlink -f $0)) * 引数 [#hdb380a5] - [[引数を処理する | UNIX & Linux コマンド・シェルスクリプト リファレンス>http://shellscript.sunone.me/parameter.html]] オプション解析のためのコマンドである getopts コマンドを使用することで、オプション・パラメータの妥当性チェック処理を容易に作成することが可能となる。 * エラー処理 [#u5638a4d] - [[シェルスクリプト内のエラーで実行を停止する「-e」と、実行コマンドを出力する「-x」オプションを使ったシェルスクリプトの開発 - このすみエンジニアブログ>https://www.konosumi.net/entry/2020/01/01/154355]] 「-e」オプションによりエラーが起きた時点でスクリプトが終了しますが、「-x」オプションにより実行コマンドが逐一出力されるため、開発中やデバッグ時はとくに便利です。 - [[シェルスクリプトやbashの処理を中断する3パターンの`-e` - とアンチパターン - tweeeetyのぶろぐ的めも>https://www.tweeeety.blog/entry/2018/06/07/235956]] -eオプションでの実行は何パターンかあります * パス [#p88528c1] - [[[bash] 実行スクリプトの絶対パスの取得 - Qiita>https://qiita.com/koara-local/items/2d67c0964188bba39e29]] SCRIPT_DIR=$(cd $(dirname $0); pwd) * 出力 [#vbbd0605] - [[シェルの入出力制御あれこれ - Qiita>https://qiita.com/tag1216/items/7ce35b7c27d371165e56]] 標準エラー出力の行頭に[ERROR]を付けて標準出力に出力する command 2> >(awk '{print "[ERROR]", $0}') * [[トラブル]]事例 [#b1ae08d3] - [[京大のスパコンでファイル約77TB分が消失、実行中のスクリプト更新で誤動作 | 日経クロステック(xTECH)>https://xtech.nikkei.com/atcl/nxt/column/18/01157/012700053/]] (2022/01/28) 担当者はこれを認識しておらず、スクリプトが実行中の状態で内容を書き換えた。結果、上書きしたスクリプトの再読み込みが発生し、未定義の変数が含まれたfindコマンドが実行された。 - [[シェルスクリプトは文字通りの逐次実行 - シリコンの谷のゾンビ>https://sleepy-yoshi.hatenablog.com/entry/20090917/p1]] タイトルにある通りシェルスクリプトは文字通りスクリプトを一行ずつ読み込んで逐次処理している. - [[Tips: 実行中のシェルスクリプトを書きかえるときには - Qiita>https://qiita.com/kitsuyui/items/d0048eeaa50293a92a60]] 「変えることができる」というよりも現実のケースでは、実行中に意図せず内容を変えてしまうことで予想しない挙動をさせてしまうことがありうる。これを防ぐにはどうするか。