Memoize |
BasicWerk
EC Support
Technique
Facebook
|
20140813214931_shell_script_tips |
|
shell_script_tips
構文チェック
% cat buggy.zsh
#! /bin/zsh
# わざと ] のあとの ; を抜かしてる
if [ -e hftfhvgch.lisp ] then
echo hjgjgjgyj
fi
# -n オプションでデバッグ
% zsh -n buggy.zsh
buggy.zsh:5: parse error near `fi'
Mac の場合、シェルスクリプトの中から呼び出す echo とコマンドラインで呼び出す echo で -n オプションの認識が異なるらしい、bash では。 (zsh でコーディングしてると「ん?そうか?」と思う。)
ともあれ、改行なしの文字列を出力するときは printf の方が無難。 # 改行なし % printf aaa aaa% # 最後の % は zsh が「改行文字は無いけどシェルの表示上改行するね」の意味 # 改行あり % printf "aaa\n" aaa
シェルスクリプトは、関数内だろうが変数はグローバルだ。 レキシカル変数化したい場合は local を使う。
% cat local.zsh
#! /bin/zsh
var="global"
function lex() {
local var="in function"
echo $var
}
# global
echo $var
# local
echo $(lex)
# one more global
echo $var
% local.zsh
global
in function
global
変数や関数を外部ファイル化したなら、呼び出し側のスクリプトでは . コマンドで読みこめば良い。 #! /bin/zsh . /path/to/lib.zsh
1行に全てのカラムが収まっていると判ってるデータで、特定のカラムを抜き出すなら awk より cut の方が書き方が簡単。
% cat sample.csv
1,item-A,2980,JPY
2,item-B,900,JPY
3,item-C,3980,JPY
4,item-D,1980,JPY
# 3番目のプライス部分だけ抜き出す
# -d セパレータ
# -f カラムナンバー
% cut -d, -f3 sample.csv
2980
900
3980
1980
# アイテム名とプライス
% cut -d, -f2,3 sample.csv
item-A,2980
item-B,900
item-C,3980
item-D,1980
# 同じことを awk でやると
% awk -F, '{ printf "%s,%d\n", $2, $3 }' sample.csv
item-A,2980
item-B,900
item-C,3980
item-D,1980
# 出力のフォーマットにこだわりがないならもうちょっとシンプルに書ける
% awk -F, '{ print $2,$3 }' sample.csv
item-A 2980
item-B 900
item-C 3980
item-D 1980
$@ と $* の違い
% cat params.zsh
#! /bin/zsh
# 引数を個別にクォートして処理したいときは "$@" を使う
foreach arg ("$@")
echo "@: $arg"
end
# "$*" はすべての引数が一つの文字列になる
echo "*: $*"
% params.zsh a b c
@: a
@: b
@: c
*: a b c
curl で http-status だけ欲しい場合は単に他の情報を捨ててしまえば良い。
% curl -s "http://basicwerk.com/memoize/" -o /dev/null -w "%{http_code}\n"
200
for ループは * や {...} で展開した結果を一つの配列とみなして動作してくれる。
% ls *.csv
data.csv
data_replaced.csv
sample.csv
for csv in *.csv
do
wc -l $csv
done
# result
1918136 data.csv
1918136 data_replaced.csv
4 sample.csv
% ls sample2/
file_1 file_2 file_3 other_1 other_2 other_3
for file in sample2/file_{1..3}
do
echo "this is a file" > $file
done
% cat sample2/file_{1..3}
this is a file
this is a file
this is a file
これらの Tips は全てこちらの本をだーっと読んで拾ったものです。
ちなみに本自体は bash で記述してあるが、僕が使ってるのが zsh なので敢えて zsh で動作を確認してみた。
|
| © Shin Nakamura/BasicWerk 2014 |