シェルスクリプト

シェルスクリプトでJavaScript文字列リテラル用のエスケープ

「JavaScript文字列リテラル用のエスケープ」という表現は微妙だけど、要はサーバサイドでJavaScriptを動的生成する時に、文字列リテラルとして任意のパラメータを出力したい場合のエスケープ処理。先日(というか先月)書いたHTMLエスケープ用のシェルスク…

シェルスクリプトでHTMLエスケープ

PHPやPerlでのHTMLエスケープの話はよく目にするけど、そういえばシェルスクリプトでは見かけないなあ、なんて思った次第でございます。動的Webコンテンツの先駆けであるCGIの普及期でさえ言語としてPerlが大々的に使われていたわけで、そもそもサーバサイド…

umask(1)は引き算しない、多分。

umask(1)の仕様を調べようとしたのである。で、ググって見つかった「デフォルトのファイルアクセス権 (umask) (Solaris のシステム管理 (基本編))」を見てちょっと驚いた。 設定する umask の値は、与えたいアクセス権の値を 666 (ファイルの場合) または 77…

リンク切れしたシンボリックリンクを探す

id:eel3:20121112:1352651058 でシンボリックリンクを張りなおすMakefileを書いたのだが、デッドリンク(リンク切れしたシンボリックリンク)がそのまま残ってしまう問題があった。この問題に対処するために、デッドリンクを探す方法を――『覚えて便利 います…

シェルスクリプトを本気で学びたい人のための10冊

シェルスクリプトについて、プログラミング言語の一種としてガッツリ学んだうえで、しかし得手不得手を見極めて、無理せずシェルスクリプトらしい使い方にとどめて日々を過ごしたい人のための10冊を選出すると、だいたいこんな感じとなる。前提として「他の…

シェルスクリプトに向いている用途

シェルスクリプトに向いている用途は、大抵の場合、以下の要件を1つ以上満たしているものだ。 作りたいものが単機能で、あまり複雑ではない。 非対話的な処理である。 既存のコマンドの羅列/組み合わせで容易に解決できる内容である。 他の言語でいう「メソ…

あえてbc(1)した話

たぶんまだまだ初級な小ネタ。こんな感じに16進数(プレフィックスなし)のデータが並んでいるテキストファイルtest.datがあって: 00000000 00000001 0000000F 00000010 7FFFFFFF 80000000 FFFFFFFE FFFFFFFFこれを元データ(32bit符号なし整数)としてちょ…

cat(1)しない話

初級小ネタ。例えばgrep(1)する際に、こんな感じのサンプルコードが示されることがある。 cat file.txt | grep foo しかし個人的には次のほうが好みだ。 grep foo file.txt せっかく引数でファイルを指定できるのだから、そちらを使いたい気分になるのだ。tr…

grep(1)しない話

もう1つ、初級小ネタ。DebianやUbuntuで、あるパッケージがインストールされているか否か調べるのに、今までdpkg(1)とgrep(1)を組み合わせていた。 dpkg -l | grep acpi ところで先日、dpkg(1)のmanを見たところ: -l, --list package-name-pattern... 「pac…

続:test(1)でシンボリックリンクか否か判定する時のオプションは-hなのか-Lなのか?

id:eel3:20121117:1353150478 の続き、だろうか? あれから3年ちょっと経つが、test(1)でファイルがシンボリックリンクか否か判定する時に-hと-Lのどちらを使うべきか、未だに迷い続けている。「どちらでもよい」と言われるとかえって迷ってしまう、難儀な性…

AWKで1byteずつファイルを読む方法 + 1文字ずつ読む方法の構想

id:eel3:20151102:1446476928 のhcaslのsh版にて、AWKで標準入力/ファイルを1byteずつ読むために試行錯誤したので、独立した記事として書いておく。現時点での結論としては、POSIXの範囲内では、awk(1)単体で標準入力やファイルから1byteずつ中身を読む方法…

8つの言語でテキストフィルタを書き比べた

※2015/11/15追記:現段階では8言語から12言語に増えている。その昔 id:eel3:20120129:1327845759 なんてことをやったのだが、性懲りもなくまた同じようなことをやってみた。作ったものはこちらに置いてある。 GitHub - eel3/hcasl: Command line tool for "h…

英辞郎の辞書ファイル(テキスト形式)をPDIC 1行テキスト形式に変換する

英辞郎のテキスト形式の辞書ファイルが入手できなくなったと聞いて、あわてて『英辞郎 第八版(辞書データVer.141/2014年8月8日版)』を入手した。付属する辞書はVer.1.41。以前購入したのがVer.1.02(2007年03月ごろ)なので、8年半ぶりだ。私の英辞郎の使い…

シェルスクリプトにGo言語を埋め込む

Go言語のコードをスクリプトとして即時実行する方法は、 go run するなり、もう少し工夫して shebang もどきを使って単体のコマンドっぽく実行するなり、いずれも簡単で情報もそれなりに見つかる。一方で、例えば perl(1) や ruby(1) でオプション -e を使う…

ソースコードから標準Cライブラリに含まれてそうな識別子を検索する

組み込み関連でクロスプラットホームなライブラリを開発する時、私の周囲十数メートルの範囲では、使用している標準Cライブラリの機能をドキュメントに明記することがある。というのも、そのライブラリがフリースタンディング環境で使用される可能性があるか…

ゼロパディングされた連番を出力+ディレクトリを作成

1〜12月の各月のデータを格納する目的で、ゼロパディングされた数値でディレクトリを作成したい。楽をしたいので、まずはゼロパディングされた連番を出力する方法を探ってみた。 シェルスクリプト(/bin/sh)の場合 seq(1)には、ゼロパディングして数値の幅…

シェルスクリプト高速化のツボ

これは備忘録。色々あって、まだ具体的なモノを何も作ってもないのにシェルスクリプトのパフォーマンス絡みでネタを収集してしまったので、ひとまずまとめてみた。shellshock(bashのアレ)があったばかりなので、ちっとばかり微妙かも。 計測してボトルネッ…

sed(1) VS printf(1) VS awk(1) リターンズ

id:eel3:20141011:1412954857 の続き。いや、CygwinではなくLinuxで計測してみただけですがな。Cygwinは少々特殊な環境だし、そもそもWindows上ではアンチウイルスソフトその他の影響でプロセス生成コストが高くなる。Unix環境でのプロセス生成コストとは大…

sed(1) VS printf(1) VS awk(1) 宿命の対決

テキストファイルに1行1個ずつ書かれているデータを、同じテンプレートを適用して出力したいのです。例えば、テキストファイルの中身がこんな感じだと仮定する。 1 2 3これを、こんな感じに変換する。 echo 1 ! echo 2 ! echo 3 !こんな風に、何らかのテンプ…

シェルスクリプトで末尾呼び出しの最適化

末尾呼び出しの最適化という最適化手法があって、これが有効な場合にスタックフレームの消費が抑えられる。具体的には、関数Aの末尾で関数Bを呼び出していて、関数Bの呼び出しについて末尾呼び出しの最適化が有効となった場合、関数B実行時に新たにスタック…

日本語版Squeakを任意のディレクトリから起動したい

日本語版Squeakという、SqueakをローカライズしたSmalltalkの処理系がある。何となく雰囲気的に開発者向けにリリースしている感じがするのだが、外野の私の気のせいかもしれない。起動用にバッチファイルとシェルスクリプトが用意されていて、環境に応じてこ…

Real World FizzBuzz

FizzBuzzプログラムは、プログラマを採用する時に全くコードを書けない人を足切りするために考案されたものだ。非常にシンプルで、汎用の高水準なプログラミング言語でコードを書ける人が慣れた言語を使えば、typoなどの細かいミスを除けば2〜3分程度で書け…

シェルスクリプトで統計処理初級、awk(1)なしで

統計処理と言えるほどではないが、データ処理して中央値や最頻値を眺めていて思った。ある程度本格的に統計処理する人はR言語とかOctaveとかPython*1とかを使うと思うし、そうでない人もPerlやRubyなどのスクリプト言語を使うと思う。シェルスクリプト使いも…

tac(1)やtail -rの代替品 迷走編

LinuxというかGNU coreutilsにはtac(1)というコマンドがある。デフォルトではtac(1)はファイルを行番号の降順に(最終行から先頭行に向かって)表示する。 $ seq 1 10 1 2 3 4 5 6 7 8 9 10 $ seq 1 10 | tac 10 9 8 7 6 5 4 3 2 1 $ seq 1 10 >zzzz1.txt $ …

バイナリファイル同士を比較したいけどcmpが無かったので頑張った話

id:eel3:20130826:1377522419 と似たようなパターンのネタ。相変わらずbusyboxな組込みLinux環境で作業していて、バイナリファイルを比較しようとしたらcmp(1)が無かった。dirname(1)に引き続き2度目……。組み込んであるbusyboxのdiffがバイナリファイルに対…

関数/メソッドのコード行数の累積グラフを表示する

Software Design 2013年08月号の第2特集にて、コード行数(LOC)の累積グラフがジニ係数のグラフに似ているとの記述があった。Software Design (ソフトウェア デザイン) 2013年 08月号 [雑誌]出版社/メーカー: 技術評論社発売日: 2013/07/18メディア: 雑誌こ…

シェルスクリプト自身のパスを取得しようとしたらdirnameが無かったので頑張った話

シェルスクリプトを書いていて、実行時にそのスクリプト自身のパスを取得したくなった。バッチファイルでいうコレみたいな感じ。 @echo off echo %~dp0 そのスクリプトは環境変数PATHに登録されたディレクトリに置くことはなく、必ずカレントディレクトリか…

Windows PowerShellの罠――trap文概論

PowerShell 1.0の頃から例外処理用にtrap文が用意されていて、これがまた興味深い。trap文の元となったのは、おそらくBourne shellの系統のシェルに用意されている組み込みコマンドtrapだろう。『Windows PowerShellインアクション』1.2.1によれば、PowerShe…

Ubuntuを10.04から12.04にしたらfile(1)の出力内容が変わった

Ubuntu 10.04から12.04.1にアップグレードしたらfile(1)の出力内容が変わった。スクリプトファイルのテキストのエンコーディングを出力するようになったようだ。例えば10.04の頃の出力はこんな感じだった。 # Groovy 2.0.5付属の起動用シェルスクリプトで実…

シンプルで無駄なテキストファイルの読み込み方

シェルスクリプトで1行ずつテキストファイルを読み込む方法を、わざわざ頑張って考えてみた。で、思いついてしまった。ある意味画期的かもしれないけど、頑張る方向を間違えた気がしないでもない。 個々のコマンドはシンプルに、でもアルゴリズムは無駄だら…