Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

シェルスクリプト

逆引き順(reverse index)で文字列をソートする

注意事項 逆順(reverse order)でなく逆引き順(reverse index)であることに注意。また日本語の「逆引き」は、文字列の先頭と末尾を逆にした並び(reverse index)の意味と、意味から単語を探す(reverse lookup)の意味の両方で使われる。ここではreverse…

タイムスタンプを変えずにテキストファイル中の文字列を置換する

howmで大量に作ったファイル中のWiki風リンク[[foo]]を[[bar]]に変えたいとかの場合。howmのテキストファイルが保存されているディレクトリにcdして以下のように実行する。 find . -xdev -type f -exec sed -i.bak 's/\[\[foo\]\]/\[\[bar\]\]/g' {} \; -exe…

grep(1)にPassThru相当のオプションはない ほか

sh(1)のパイプの中で左辺のコマンドの戻り値を${PIPESTATUS[0]}で参照することはできない。 grep(1)でマッチの結果にかかわらず、すべての行を標準出力へ出力することはできない。 tee(1)でパイプの入力を複数のファイルディスクリプタに複製して出力するこ…

rbashでディレクトリトラバーサルは防げない

satob.hatenablog.com で挙げた # cat authorized_keys command="ls /$SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB.... $ ssh root@xxx.xxx.xxx.xxx -i ~/.ssh/com "tmp;hostname" ls: /tmp;hostname: No such file or directory みたいなケースで$SSH_ORIGINAL_CO…

外部プロセスとしてシェルスクリプトを起動する方法

任意の処理系から外部プロセスとしてシェルスクリプトを起動したい場合、大きく以下の2つの方法が考えられます。 (1) shの引数にシェルスクリプトを指定する /bin/sh foobar.sh のように、shの引数にシェルスクリプトを指定して起動する。 shに与えるパラメ…

for 文の内容を並列実行

シェルスクリプトの for i in *; do echo $i; doneみたいなのがスケールアウトするようにならないかなぁ、という妄想。

コロンの使用法

id:satob:20051226 のなかださんのコメント、 なかだ 『:は${VAR=expr}と組み合わせるのがidiomでしょう。 : ${PARAM1=foobar} ${PARAM2=hoge}』 の話。すなわち、Colon と Dollar Sign と Opening/Closing Brace と Equals の使いかた(Google は記号をクエ…

よく分からないコマンド(エクスクラメーション + アスタリスク)

http://www.rpm.org/max-rpm/s1-preface-parts.html には ls -FAl !*|lessというコマンドがあって、「このコマンドが分からない人でも安心!」みたいに書いてあるんだけど、どういう理屈で動いてんのか分かりませんよ俺。 "!*" ってナニ !? ……実験してみたら…

知らなかったコマンド(コロン)

jman :で引けるのも驚いたが、 ":" (コロン)は sh のビルトインコマンドらしい。常に値 0 (真)を返す。 while :; do echo "hoge"; sleep 1; doneのようにすると無限ループにできる。

シェルスクリプトで echo on

MS-DOS のバッチファイルでは、次のようにすると、そのバッチファイル中で実行されるコマンドが逐一表示されるようになる。 echo on同等のことを sh でする方法はないものか。デバッグに便利だと思うんだけど。→ 解決。sh にオプション -v または -x を指定…

コマンドを繰り返し実行

次のような、引数に指定されたコマンドを n 回繰り返し実行するスクリプト repeat があるとしよう。 #!/bin/sh SEQ=/usr/bin/seq TIMES=$1 shift T=`$SEQ 1 1 $TIMES` for i in $T; do for COMMAND in "$@"; do $COMMAND done done実行すると次のようになる…

シェルスクリプトで配列(リスト)を連結

二つの配列(リスト)を連結したい場合は、単純に次のようにすればよい。 # Perl で言えば push(@hoge, @piyo); HOGE="$HOGE $PIYO"例えば、次のようにすればどうなるか分かる。 HOGE=`ls`; PIYO=`ls /`; HOGE="$HOGE $PIYO"; for i in $HOGE; do echo $i; d…

Shell Script ワンライナーで改行

Shell Script カテゴリを作った方がいいかも。 [nuts@cclub mail]$ sh -c 'for i in `ls -la | grep -E "\-rw\-+\W+1 \w+\W+[0-9]{3}" | perl -pe "s/.+ (\w+)/\1/g"`; do echo chown :cclub $i; done' chown :cclub bar chown :cclub baz : : [nuts@cclub m…

Shell Script でのシングルクォートとダブルクォートの違い

[nuts@cclub mail]$ sh -c "for i in `ls -la \ | grep -E '\-rw\-+\W+1 \w+\W+[0-9]{3}' \ | perl -pe 's/.+ (\w+)/\1/g'`; do echo chown :cclub $i; done" Syntax error: word unexpected [nuts@cclub mail]$ sh -c 'for i in `ls -la \ | grep -E "\-rw\…

shell script で使ってる環境変数一覧を得る方法

ないものか。sh に -x つけて起動した出力を利用すれば、load されてるけど script の中では store されてない環境変数一覧、ってのを作れるかも知れない。……と思ったけど変数って ${HOGE} とかいう風にも参照するんだっけ……。