茶トラ猫エンジニア

フリーランスとして働く、先が見えないエンジニアのメモ帳

シェル

Linuxのコマンドの結果をパイプで次のコマンドの任意の位置に使う方法

タイトルだけ見ると何を言っているのかよくわからないかもしれませんが、要は Linux や Mac のターミナル上で以下のようなことがしたいわけです。 複数行のテキストデータから 1 行目を取り出し、その 1 行から最初の空白までの項目を curl コマンドのリクエ…

シェルスクリプトでwhile文を使ってループ処理をする

今までシェルでループ処理をする場合、for 文を使う機会が非常に多かったのですが、特定の条件の間だけ処理を繰り返すには while 文が最適です。 今回は、while 文の使い方と使えるシチュエーションについて紹介していきます。 whileの基本構文 条件式の書き…

シェルスクリプトでファイルを1行ずつ読み込む

シェルスクリプトで、ファイルに書かれた内容を 1 行ずつ処理したいケースってたまにありますよね。 いくつか方法はあるのですが、ファイルの容量や書きやすさなど好みに応じて使い分けてみるのが良さそうです。 今回は 3 パターンの方法を紹介したいと思い…

シェルで連想配列の変数を使う方法

シェルスクリプトでも連想配列が扱えるようになって、幅が広がったような気がします。 これなら、PHP などの言語しか経験がない人でも、それほど抵抗なくシェルの世界に入れるのではないでしょうか。 連想配列は宣言が必要 連想配列の値の参照 連想配列の要…

シェルで配列の変数を使ってループ処理する方法

これまで、シェルで配列を扱う機会はほとんどなかったのですが、最近のシェルでは連想配列が使えるようになったということで、配列を理解しておくことにしました。 連想配列については次回に書くとして、今回は普通の配列です。 下記のように半角スペース区…

シェルで整数型の変数を使って計算処理をする方法

シェルでは明示的に整数型の変数が宣言できます。 これまでループのカウントや計算などは expr コマンドを利用していたのですが、明示的に整数型の変数が宣言できれば、他の言語と同じように算術演算子が使えるので便利です。 整数型の変数で計算させてみる …

シェルスクリプトで開始日から終了日までの日付を算出

過去データの集計をやり直す SQL を作るために、シェルで終了日から 1 日ずつ減算していく方法を考えてみました。 日付自体はよく使いますが、カウントアップやカウントダウンのような動作をさせることも稀なので、備忘録として残しておきます。 方法は他に…

MySQLで日付単位に分割したテーブルを作成するシェルスクリプト

一般ユーザ相手のサービスをする場合、ユーザ数がどこまで増えるか読みにくいので 1 つのテーブルに格納されるレコード数が気になるところです。 そこで、パーティショニングやシャーディングなどの手法が候補としてあがるわけですが、どちらも運用面でメリ…

シェルスクリプトでexprより複雑な数値計算させるbcコマンド

シェルスクリプトで数値計算をする時に expr を使用することが多いですが、割算をした場合は小数部分を表示させることができません。 例えば、3 / 5 の場合は実際に計算をすると 0.6 になりますが、expr 3 / 5 の結果は 0 が返ります。 そこで小数部分を表示…

シェルスクリプトで短時間に大量ファイルを作成する方法

リモートへのファイルコピーを検証していて、1 つのファイルの容量は軽くてもいいから大量のファイルのコピーを試したいケースに遭遇しました。 そんな時、シェルを使うと楽で、少し調整すればコマンドラインからワンライナーで実行もできます。 今回は、そ…

標準出力と標準エラー出力をパイプに渡す

標準出力先をファイルにリダイレクトすることはよくありますが、標準エラー出力を使う機会は意外に少ないです。 しかしツールやパッケージ製品になると標準エラー出力も活用されているようです。 でも明らかにエラーじゃない内容が標準エラー出力されるって…

シェルスクリプトで文字列操作(文字数、抜き出し、ヒアドキュメント)

これまでシェスルクリプトを利用する際には、複数のコマンドを実行して処理を自動化するために使う機会が多かったです。 今回は新たに文字列を制御するケースに遭遇したので、その内容を備忘録として残しておきたいと思います。 文字列の長さを算出する 文字…

kshのechoで改行を制御する

ksh の echo で改行しないように -n オプションを使ってみましたが、どうやら -n オプションはサポートされていないようです。 例えばスクリプトで処理を実行して、処理が完了したら OK を表示したいようなプログラムはどうやって書けばいいでしょうか。

kshでコマンド補完とコマンド履歴の確認をする

過去に IBM の AIX を使う機会があったのですが、デフォルトのシェル(shell)が ksh(korn Shell)になってて苦戦した記憶があります。 シェルは一般的には、bash, csh, zsh あたりが有名ですが ksh とは珍しいです。(UNIXだと一般的なのかな?) 今回は、ksh の…

シェルスクリプトでshiftとwhileの組み合わせ

以前、シェルスクリプトの shift について書きましたが、今回は shift を使った便利なテクニックです。 テクニックといっても、全部の引数をループで受け取るだけの簡単な TIPS ですが・・・。 では早速、while を使った簡単なプログラムです。 $ vi hoge.sh…

シェルスクリプトのshiftで10個以上の引数を制御する

シェルスクリプト(ここではbash)で引数を受け取るときは、$(ダラー)を使って表現します。 例えば、最初の引数は $1、2 番目の引数は $2 のように、9 個の引数($9)まで利用することができます。 じゃあ、10 個以上は引数を与えれないのかっていうと、実は 10 …

sudoでroot権限のスクリプトを実行する

Linux において、root にしか実行権限のないシェルスクリプトを一般ユーザーで実行したい場合、sudo コマンドを使って実行を許可できます。 sudo コマンドは、セキュリティに大きく絡むコマンドなので設定ファイルの理解が重要となってきます。 今回は sudo …

シェルで一定期間を過ぎた古いファイルを削除する(7日前など)

Linux でバックアップファイルを作成する際、いつ作成したのかがわかりやすいようにファイル名に日付を付けることが多いです。 例えば以下のような感じですね。 TODAY=`date +%Y-%m-%d` tar czvf hogehoge-${TODAY}.tar.gz hogehoge 今回は、このバックアッ…

リダイレクトとファイルディスクリプタ

今回はリダイレクトのお話です。 リダイレクトといっても、Http リダイレクトとは別です。 プログラムの入力元や出力先を通常とは違うものに変更することの方です。 実はこの話題については非常に苦い思い出があるので、深入りしたくないのですが・・・(笑) …