お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。
投稿日:
OS::Linux::コマンド

シェルスクリプトでオプションパラメーターを解析するやつ
基本shiftと合わせて使う

サンプルコード

とりあえず最低限の動作サンプル的なやつ

#!/bin/bash

usage_exit () {
    echo "Usage: $0 [-p piyo] [-f] <foo> <bar>"
    exit 1
}

# オプション名の後ろに `:` をつけるとパラメーターを取れる、つけないと取れない
# オプション先頭に `:` をつけるとエラーハンドリングを自動でしなくなる
#  e.g. `getopts :p:fh`
while getopts p:fh OPT
do
    case $OPT in
            p) piyo=$OPTARG
            ;;
            f) fuga=1
            ;;
            h) usage_exit
            ;;
            \?) usage_exit
            ;;
    esac
done

# オプション分の引数をずらす
# これがないとオプションが `$1` とかに入ってくる
shift $((OPTIND - 1))

# オプションを抜いた引数を取る
foo=$1
bar=$2

echo $foo
echo $bar
echo $piyo
echo $fuga
投稿日:
OS::Linux::コマンドソフトウェア::Bash

シェルスクリプトが設置されているパスを取得する

  • cwd=$(cd $(dirname $0); pwd)
    • $0はシェルスクリプトのフルパス
    • dirnameでスラッシュから始まるファイル名を除去
    • cdで移動
    • pwdで表示

現在のパスを移動せずにシェルスクリプト内でパスを移動する

これはサブシェルを使うと出来る
サブシェルとは()で囲まれた部分で、この中では別のシェルが動いている
例えば次のスクリプトはfoo/に移動し中のファイルリストを表示するが、2行目では現在の位置にあるファイルリストを表示するため移動していない
コマンド展開記法$()もサブシェルが動いている

(cd foo/; ls -la)
ls -la

複数コマンドをワンライナーで実行する

;

  • 以下のように書くと連続で線形実行される。手前が異常終了しても続く
    • curl; echo 2;

&

コマンドの末尾に&をつけるとバックグラウンドで実行される

  • 以下の例では左がバックグラウンド、右がフォアグラウンドで実行される
    • echo 1 & echo 2

&&

AndAlso的な動きをする

  • 以下のように書くと連続で線形実行される。手前が異常終了すると続かない
    • curl && echo 2

|

コマンドの末尾に|をつけると標準出力が次にリダイレクトされる

  • 以下のように書くと連続で線形実行される。手前の標準出力が次にリダイレクトされる
    • echo 1 | xargs -I{} echo {}2

||

OrElse的な動きをする

  • 以下のように書くと連続で線形実行される。手前が異常終了した場合のみ次が動く
    • curl || echo 1
投稿日:
OS::Linux::コマンド

HTTPを始めFTPやLDAPなど多様なプロトコルに対応したクライアント

curl [options...] <url>

Options

ヘルプが充実してるのでヘルプ見たほうが早い

  • -X method
    • -X POSTとかするとそのメソッドを投げられる
    • -XPOST形式でも動く
  • -s
    • 通信の進捗を表示しない
    • 通信エラーも表示しない
  • -S
    • -sが指定されている時にエラーを表示する
  • -L
    • location headersを読む
    • 3xx系のコードの追従する(302 redirectとか)
    • -sSLでセットにして使うことが多い
  • -v
    • --verbose
    • レスポンス内容が全部出る
      • レスポンスヘッダを見る時に使える(-Iでも見れるがHEAD methodを投げてるだけなので-Xと併用できない)
      • エラー出力されるのでgrepしたい時などは標準出力にリダイレクトが必要
        • 2>&1
  • -H
    • ヘッダを投げられる
    • -H 'Content-Type: application/json'
    • -H 'User-Agent:' -H 'Accept:' -H 'Host:'でcurl自身の既定ヘッダを消せる。但しHostヘッダーのないリクエストはRFC違反であるため受け付けられる保証はない
  • -d
    • x-www-form-urlencodedを投げる時に使う
    • -d key=value
      • 複数あるときは複数指定する
    • 暗黙的に-X POST扱いになる
  • --data-urlencode
    • -dと同じだが中身がURLエンコードされる
  • -o <path>
    • ファイルを保存する
    • ダウンロード目当てならwgetのほうが使いやすい

JSONのPOST

curl -v -H 'Content-Type: application/json' -d '{ "hoge": "piyo" }' -- 'https://example.com'

参考

投稿日:
OS::Linux::コマンド言語::Perl

文字列を編集したりするのに大変便利なやつ。sedやawkの代わりに使える。構文はPerlそのものが使える。なにせPerlなので

コマンドラインオプション

  • -e
    • ワンライナーでコードを書くやつ
    • php -rnode -eと同じ
    • Evaluate, Eval, 評価
  • -n
    • 入力の各行に対し処理がかかる
    • $.で行番号、$_で行の文字列を取得できる
    • while (<>)相当の処理
  • -p
    • 入力の各行に対し処理を行い、更にprint $_相当の処理を実行する
  • -l
    • 入力($_)から改行文字を削除し出力に改行を追加する
  • -a
    • 入力の各行に対してawk相当の文字列分割処理を行う(autosplit mode with -n or -p)
    • 分割した文字は$Fに配列として入るので次のようにして取得できる
      • perl -ale 'print "$F[0] - $F[1]'
    • $#Fを指定すると分割した個数が取れる
  • -F/pattern/
    • -aでsplitするパターンを設定する
    • 例えば-F,とするとCSVを分割できる
  • -i[ext]
    • ファイルを編集する
    • 使用例:perl -i -pe 's/aaa/xxx/' foo.txt
    • -i.bakのように指定するとバックアップファイルが作成される
    • このオプションは次に続く文字が解釈されるため、単体で指定する必要がある(-ipeのようには使えない)

構文

変数を指定しない場合、基本的に$_として扱われる

  • print
    • 標準出力に出力
    • 単体ではprint $_と同じ挙動をする
  • $hoge =~ s/foo/bar/
    • fooをbarに置換
  • /(.+)/; print $1
    • キャプチャした内容を出力
    • コマンド例:echo hoge.jpg | perl -ne '/(.+)./; print $1'
  • $_
    • 基本的に書かなくても補完される
    • 例えばecho aaabbc | perl -ne 's/c/d/; print'の出力はaaabbdとなる
    • その他特殊変数:https://perldoc.jp/docs/perl/5.18.1/perlvar.pod
  • END{}
    • このブロックで囲んだコードは実行時の最後に動作する
      • -n, -pを指定した場合、END{}$_が取れないので渡す場合は$x = $_; END{ print $x }のように別の変数に代入する必要がある
    • https://perldoc.jp/docs/perl/5.38.0/perlmod.pod#BEGIN44-32UNITCHECK44-32CHECK44-32INIT32and32END

チートシート

変数置換

一例

ls -l | perl -ale '$F[8] =~ s/\.html//; print "$F[8]";'

特定行を取得

1のところが行数なので、ここを変えることで任意の行の文字列を取れる

perl -ne 'print if $. == 1'

正規表現の名前付きキャプチャ

echo "foo bar" | perl -pe 's/(?<first>.+) (?<last>.+)/$+{first}-$+{last}/'

逆順出力

unshiftで配列の先頭に値を追加し、END{}で最後に出力している

cat <<EOF | perl -ne 'unshift @x, $_; END{ print @x }'
aaa
bbb
ccc
EOF