ShellScript?

概要

  • シェルプログラミング実用テクニックの知識のメモ

疑問

  • echo '432' | awk '$0~"\\."'は何で\\が二つ必要なの?
    • シングルクオートとかバッククオートの中で、\が二つ必要なケースが何個かある。統一的な理解は?

問題集

DQ, SQ, 何もなしの違い

  • SQは展開しない、何もなしはスペース区切り始めのものだけ展開、DQは全部展開
A=test
B=$A echo hoge # Bに"test"が入って、hogeが標準出力
B="$A echo hoge" # Bに"test echo hoge"が入る
B='$A echo hoge' # Bに"$A echo hoge"が入る

並列実行

# -a - でパイプから入力を受け取る
$ ls * | parallel -a - --dry-run echo
echo a
echo b
# {} で場所を指定できる
$ ls * | parallel -a - --dry-run echo {} end
echo a end
echo b end
# アトミックな処理をしたいなら '' で囲む。というか基本的には囲んだほうがいい
$ ls * | parallel -a - --dry-run 'echo {} 1; echo {} 2'
echo a 1; echo a 2
echo b 1; echo b 2
echo test.xt 1; echo test.xt 2
echo x.txt 1; echo x.txt 2
# {.} で basename が取れる。test.sh なら test 
$ echo test.sh | parallel -a - --dry-run echo {.}
sh -c echo test
# zip の例
$ ls *.zip | parallel -a - --dry-run 'mkdir {.}; unzip {} -d {.}'

Tips

  • McIloy?によるパイプの発明により、部品に分解
    • 部品の組み合わせは指数関数的に存在するので、大きなコマンドを作るより適用性が高い
  • Shell Scriptの文法が汚いのはしょうがない
    • 「手のように」使える必要があるので、文法的に汚いが、じゃあC++みたいに複雑にする?という話がある
  • R.Pike データ構造がアルゴリズムを規定する。"Representation is the essence of programming (Brook)"
  • プログラムのほとんどは例外処理
  • sudo apt-get install manpages-jaを入れると日本語のmanが手に入る
  • treeというコマンドでディレクトリ構造を木構造として描画してくれる。
  • POSIX
    • UNIX互換OSにはさまざまな機能の追加や変更がなされているため、UNIX互換OSの間で最低限必要な仕様や規格を定め、互換性を保つため
    • 全UNIXで動く本、みたいなものを書こうとしたら、これに準拠する必要がある
    • でも拡張を模索し、良いユーザたるには、それは関係ないよね?

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS