Bash v3 以下でも set -u 時に変数が定義されてるか確認する方法

以下のように、変数への値がセットされているかで分岐するシェルスクリプトがあったとします。このスクリプトは正常に動作します。 #!/bin/sh if [ -n "$CIRCLE_PULL_REQUEST" ]; then echo '$CIRCLE_PULL_REQUEST is defined.' else echo '$CIRCLE_PULL_REQUEST is NOT defined.' fi 堅牢なシェルスクリプトを書く時は #!/bin/sh を #!/bin/sh -u にすることが多いです。typo 等による意図しない変数の利用を防いでくれます。 ...

2018-10-15 (月) · masutaka

タイムスタンプを変えずに文字コードを変換する方法

必要になって調べたので、メモメモ。 以下の例では、hoge.txt のタイムスタンプを変えずに UTF-8 に変換している。 #!/bin/sh FILE=hoge.txt TIMESTAMP=`ls -d -l --time-style=full-iso $FILE | awk '{print $6 " " $7 }'` echo $FILE mv $FILE ${FILE}.bak nkf -w ${FILE}.bak > $FILE rm ${FILE}.bak touch -d "$TIMESTAMP" $FILE

2009-12-17 (木) · masutaka

入力したパスワードを端末に表示させない方法

スクリプト中でこんなプロンプトを出して、パスワードを読み取りたい場合。 |Password: read コマンドを使えば可能だが、入力した文字列が見えてしまう。そこで “stty -echo” を使う。端末への表示を抑制できる。入力が終わったら “stty echo” で元に戻す。 ...

2009-02-19 (木) · masutaka

文字列の検索

今まで、ある変数にある文字列が含まれているかを検索する場合、 grep を使うなんてなんだか大げさだなあと感じていた件について。 |if echo $BAR | grep “hoge” > /dev/null; then | … |fi ...

2007-09-06 (木) · masutaka

type

which より type を使った方が良いとどこかに書いてあったような気がする。

2007-04-28 (土) · masutaka

$* と $@ の違い

$* 全引数リスト。ダブルクォートで囲んだ場合、 “$1 $2 … $n” と全引数を一つにくっつけた物に展開される。 $@ 全引数リスト。ダブルクォートで囲んだ場合、 “$1” “$2” … “$n” とそれぞれの引数を個別にダブルクォートで囲んで展開する。 ...

2004-10-21 (木) · masutaka

exec -- 現在実行中のシェルに代わり、指定したコマンドを実行する

シェルから % ls とコマンドを実行すると、シェルは以下のことを行う。 システムコール fork(2) を呼び、子プロセスを生成する。 子プロセスは ls を exec(2) する。 親プロセスであるシェルは、ls の実行が完了するのを待つ (wait する)。 一方、 ...

2004-02-20 (金) · masutaka

$HOME/bin/Emacs

2行に分けて書くと、XMODIFIERS=@im=noneが効かなくなる。 1行が長くなる場合は、’'を使う。

2002-06-24 (月) · masutaka

testコマンド (by 2ch)

test == [ だからこんなのがあったのか! |% ls -al which [ |lrwxrwxrwx 1 root root 4 Jan 15 05:45 /usr/bin/[ -> test あとついでに言っておくと、 |read choise で何も入力せずただリターン押されると |[ = s ] という評価になり、"[: s: unknown operand"で激しく鬱になるので、 |[ “$choise” = s ] と書くこと。 ...

2002-02-17 (日) · masutaka