なんか日本語変かな?
普段bashを使っていると、シェルスクリプト中でうっかり配列を使ってエラーになりますね。
shbangをbashにしてもいいんですが、環境によってパスが異なることがあるので書き換えが面倒です。そこで、なんとかshで配列を扱う方法を考えてみました。
こたえ:cutを使う
とまぁ、これでピンときたら以降は読む必要なし。
bashの配列定義を見ていてふと思いつきました。bashの配列ってスペース区切りなんですよね。別にカンマ区切りでも何でもいいんですが、カンマだとなかなか思いつかなかったかも。
cutは1行を1レコードとして扱い、指定されたデリミタでフィールドを取り出せるコマンドです。
おさらい:bashの配列定義
たとえばWebスクレイピングなどで、キーワードごとに取り出したい情報の位置が違うとかよくあります。
sample.txt
6行後ろを見る
3行前の情報
5行前の情報
2行後ろを見る
3行前を見る
2行後ろの情報
6行後ろの情報
5行前を見る
こんなテキストがあったとして。。。
#! /bin/local/bash
declare -a KEYWD_A=("2行後ろを見る" "3行前を見る" "6行後ろを見る" "5行前を見る")
declare -a OPTION_A=("-A" "-B" "-A" "-B")
declare -a SWITCH_A=(2 3 6 5)
for ((NUM = 0; NUM < ${#KEYWD_A[@]}; NUM++)) {
if [ "${OPTION_A[$NUM]}" == "-A" ] ; then COMMAND="tail"; else COMMAND="head"; fi
grep sample.txt -e "${KEYWD_A[$NUM]}" ${OPTION_A[NUM]} ${SWITCH_A[NUM]} | $COMMAND -1
}
こんな感じで配列を定義して使いますね。
蛇足:shでは疑似配列?
配列定義をスペースでつないでひとつの変数にします。(別にスペースじゃなくてもいいけど)
#! /bin/sh
KEYWD_A="2行後ろを見る 3行前を見る 6行後ろを見る 5行前を見る"
OPTION_A="-A -B -A -B"
SWITCH_A="2 3 6 5"
for NUM in `seq 1 4`;
do
if [ "`echo $OPTION_A | cut -d ' ' -f $NUM`" == "-A" ] ; then COMMAND="tail"; else COMMAND="head"; fi
grep sample.txt -e "`echo $KEYWD_A | cut -d ' ' -f $NUM`" `echo $OPTION_A | cut -d ' ' -f $NUM` `echo $SWITCH_A | cut -d ' ' -f $NUM` | $COMMAND -1
done
こんな感じ。もっといいやり方あったら教えてください。
※なんか色々サンプルコードミスっててすみません。修正しました。