2013年4月17日水曜日

bashの書式いろいろ

他のシェルスクリプトを呼び出す

source ./common.sh

文字列を分割する

$aをカンマで分割したい場合
IFS=','
set -- $a
$1,$2,...に分割された部分文字列が順次入る.
IFSがデリミタ.

関数

関数の定義は
funcname() {
 :
}
引数は,$1,$2,...に入る.
返り値は,echo で返す.
関数は`funcname`で呼び出す.
引数はコマンドラインでの作法と同じ.

簡単な例:

to_cyg() {
    echo "/cygdrive/${1/:/}"
}
data_basedir="c:/data/trimming/"
src_dir="${data_basedir}src/"
cyg_src_dir=`to_cyg ${src_dir}`

ローカル変数

関数内でのみ有効なローカル変数の使用
local $filename=$1

計算

bash限定とのことだが(未確認),exprを明示的に呼び出さなくてもよい記述方法として,$(( と $)) で囲む方法がある.
中では,変数名に$を付けなくてよい.
local xmin=$2
local ymin=$3
local xmax=$4
local ymax=$7
local width=$((xmax - xmin + 1))
local height=$((ymax - ymin + 1))

配列

配列への代入は,()でくくる.
p=(`split_answer ${answer}`)
通常の変数と同じように使用できる.添字に変数を使う場合,$は不要.
p_width=5
:
${p[p_width]}

2013年4月16日火曜日

bashでファイル名操作


#! /usr/bin/sh

f="/cygdrive/c/data/trimming/src/JPCNN093.IMG"

echo "full: $f"

directory=${f%/*}
echo "directory: $directory"

other_directory=${directory/src/dst}
echo "other_directory: $other_directory"

basename=${f##*/}
echo "basename: $basename"

filename=${basename%.*}
echo "filename: $filename"

extension=${basename##*.}
echo "extension: $extension"

stringstreamをatoiの代わりに使う

そこまでして無理に使わなくてもという気もしますが.

#include <sstream>

std::stringstream s;
s << argv[1];
s >> width;

s.clear();
s << argv[2];
s >> height;

これで,

width = atoi(argv[1]);
height = atoi(argv[2]);

と同じことができる.

stringstreamを使いまわすときに,s.clear() すること.

入出力をまとめることもできるけれども,文字列の間に区切り文字が必要.

std::stringstream s;
s << argv[1] << " " << argv[2];
s >> width >> height;

2013年4月4日木曜日

sedで置換

基本技だがすぐに忘れてしまう...

sed -e "s/置換前/置換後/g" 入力ファイル名 > 出力ファイル名