読者です 読者をやめる 読者になる 読者になる

シェルスクリプトメモ

なにこれ?

  • ググったり調べたりしたコマンドや構文の一覧。
  • 現時点で知っているコマンドや構文は出てこない。どこかで追記できればいいが・・・。
  • シェルは基本的に bash

目的

  • 自分が把握できているコマンドや構文を整理する。

command - コマンド

  • cut

    • sh cut -f 1 -d "=" $HOGE_CONF
      • HOGE_CONF の各行を "=" でsplitして、各行の第1要素を取得。インデックスは1から。)
      • d(delimiter) オプション - デリミタ(区切り)を指定
      • f オプション - 何番目の要素を抽出するかを指定
      • c オプション - 指定した文字数の文字を取り出す
        • 文字数の指定には「開始位置-終了位置」のように範囲で指定できる
  • eval

    • $ val="1234"; test="val"; x=\$${test}; echo $y
      • -> 1234
    • bash は一度に変数を複数展開できない。一気に展開したいときに使う。この例では $y が一気に展開されている。
  • paste

    • paste -s -d " " $HOGE_CONF
      • HOGE_CONF の各行を1行にマージ。区切り文字を" "にする。デフォルトはタブ。
      • HOGE_CONF_2, 3... をさらに引数に加えれば、複数ファイルからの入力となる。
      • s(serial) オプションは、各入力ファイルごとに行をマージする。デフォルトは、同一行ごとにマージする。
  • pdsh

    • psdh -R ssh -f $PARA_NUM -l $DST_USER -w $SERVER "コマンド"
      • f オプション - 並行稼動リモートコマンド数
      • l オプション - リモートサーバでコマンドを実行するユーザを指定
      • w オプション - ターゲットサーバ
      • rsh との差異 -> パラレルが可能。rsh はシングルのみ。
  • tr

    • tr [A-Z] [a-z] $FILE
      • FILE の大文字を小文字に変換
    • echo "test,,,test" | tr -s ',' ' '
      • -> test test
      • s(squeeze-repeats) オプションは、

        同じ文字の繰り返しを 1 文字に置き換える。この操作は変換や削除のあとに行われる。 SET1 にある文字の繰り返をし、その文字 1 文字に置き換える。

  • sort (2014/3/3追記)

    • cat hoge | sort -gk1 -gk2 -gk3
      • hoge の 第1カラム -> 第1カラム -> 第1カラム の順に、各カラムを数字として行をソートする
      • k オプション(-k POS1 [POS2]) - POS1 以降 POS2 までをほキーとしてソートする
      • g オプション - 数字としてソートする
  • grep (2014/3/3追記)

    • cat hoge | grep -Cnum fuga
      • hoge から fuga を含む行の前後num行を取得する
    • echo "1"$'\n'"2"$'\n'"3"$'\n'"4"$'\n'"5"$'\n'"6" | grep -C1 "4"
      • -> 3 4 5
    • grep でも知らんオプションが有る!
  • tree (2014/3/4追記)

    • ディレクトリの階層構造を標準出力する
  • expr (2014/3/4追記)

    • expr "abcdefghogeijkl" : ".*\(h\)oge.*"
      • -> h
      • .*\(h\)oge.*abcdefghogeijkl に文字列として一致するか正規表現検索し、マッチすれば()内を標準出力
  • sha1sum (2014/3/5追記)

    • sha1sum -b ${FILENAME} > ${FILENAME}.sha1sum
      • ${FILENAME} をバイナリモードで読み込み、${FILENAME}.sha1sum に sha1 チェックサムを出力

syntax - 構文

  • バッククオートによる、`コマンド`は古い書式だし、可読性が低い。

    • $(コマンド)を使おう
  • ドット. で外部ファイル読込

    • 例) . $HOGE_CONF
  • 比較(test)

    • 文字列
      • -z : 文字列の長さが 0 なら true (2014/3/4追記)
    • ファイル属性確認
      • -r : 読み取り可能ファイルなら真(2014/3/31追記)
  • ifの謎構文 (2014/3/5追記)

    • if sha1sum -b ${FILENAME} > ${FILENAME}.sha1sum ; then.....みたいな書き方
      • sha1チェックサム生成が正常終了したかどうかで分岐させようとしている気がするが、こんな構文知らんぞ・・・
  • 変数の文字列処理 (2014/3/14追記)

    • shとbashでの変数内の文字列置換など - ろば電子が詰まっている
      • ${変数名#パターン} → 前方一致でのマッチ部分削除(最短マッチ)
      • ${変数名##パターン} → 前方一致でのマッチ部分削除(最長マッチ)
      • ${変数名%パターン} → 後方一致でのマッチ部分削除(最短マッチ)
      • ${変数名%%パターン} → 後方一致でのマッチ部分削除(最長マッチ)
      • ${変数名/置換前文字列/置換後文字列} → 文字列置換(最初にマッチしたもののみ)
      • ${変数名//置換前文字列/置換後文字列} → 文字列置換(マッチしたものすべて)
  • オプション解析 (2014/3/14追記)

番外編 - 特殊パーミッション

  • suid(Set User ID)
    • 実行ファイルに設定される属性
    • 実行ファイルの所有者の権限で動作する
    • 例) /usr/bin/passwd
  • sgid(Set Group ID)
    • 実行ファイル、もしくはディレクトリに設定される属性
    • 実行ファイルにSGIDが設定された場合
      • SUIDと同じく、実行ファイルは所有グループの権限で動作
    • ディレクトリにSGIDが設定された場合
      • そのディレクトリ以下で作成したファイルおよびディレクトリの所有グループは、自動的に親ディレクトリと同じになる
    • 例) /usr/bin/wall
  • sticy(Sticky bit)
    • ディレクトリに設定される属性
    • 実際のパーミッションに関係なく、ファイルもしくはディレクトリの所有者と、rootユーザーのみが名前の変更と削除を行える
    • 例) /tmp

UNIX処方箋:SUIDとは - ITmedia エンタープライズ
Linuxの特殊なパーミッション – No:227 – Linuxで自宅サーバ構築(新森からの雑記)