LoginSignup
1
1

More than 5 years have passed since last update.

POSIXで配列を扱う

Last updated at Posted at 2016-08-02

なんか日本語変かな?

普段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

こんな感じ。もっといいやり方あったら教えてください。  

※なんか色々サンプルコードミスっててすみません。修正しました。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1