L'Isola di Niente
L'Isola di Niente » ShellScript Tips » シェルスクリプトの文字列と配列

シェルスクリプトの文字列と配列

# 最終更新日 2017.01.01

シェルスクリプトが扱うのは全部文字列です。
C 言語等では文字列は単なる配列ですが少し違うようです。
文字列の追加、抜き出し、置換
文字列は配列とは違います、追加や抜き出しは以下のようになる。
#!/bin/sh

# echo の場合は半角空白があっても問題ない
echo 優木苗 鴫野睦

# メタ文字を含む文字列を変数に入れる場合はクォーテーションで囲む
kawaii='優木苗 鴫野睦'
echo $kawaii
#=> 優木苗 鴫野睦

# += で文字列を合体できる
kawaii+=" 真白透子"
echo $kawaii
#=> 優木苗 鴫野睦 真白透子

# $ISF 区切りで for 文にできる
for girl in $kawaii; do
    echo ${girl}は俺の愛する人
done

# 配列ではないのでこうなる
echo $kawaii[1]
#=> 優木苗 鴫野睦 真白透子[1]

# 部分抜き出しはオフセットと長さを以下のように
# 日本語も一文字として扱われる
toko=${kawaii:7}
echo $toko
#=> 真白透子
mutsumi=${kawaii:4:3}
echo $mutsumi
#=> 鴫野睦

# 行頭から最初と最後のパターン(ここでは空白)まで除外
echo ${kawaii#* }
#=> 鴫野睦 真白透子
echo ${kawaii##* }
#=> 真白透子

# 行末から最初と最後のパターン(ここでは空白)まで除外
echo ${kawaii% *}
#=> 優木苗 鴫野睦
echo ${kawaii%% *}
#=> 優木苗

# 全ての空白をアットマークに置換
echo ${kawaii// /@}
#=> 優木苗@鴫野睦@真白透子

# 最初にマッチした文字列のみ置換
echo ${kawaii/鴫野睦/生徒会にいった}
#=> 優木苗 生徒会にいった 真白透子

文字列のブレース展開
#!/bin/sh

# $IFS 区切りの文字列に展開される
echo 僕は{優木苗,鴫野睦,真白透子}が好き
#=>僕は優木苗が好き 僕は鴫野睦が好き 僕は真白透子が好き

# 範囲指定だと文字コード表の順番になるようだ
echo {3..6}
#=> 3 4 5 6
echo {a..g}
#=> a b c d e f g
echo {X..c}
#=> X Y Z [  ] ^ _ ` a b c

# 連番ファイルが急遽必要になった時なんかに便利
touch test_file{1..20000}.txt

文字列の大文字、小文字反転
#!/bin/sh

# 記号が一つなら一文字目のみ適用される

TEXT=abcDEF

echo ${TEXT^^}
#=>ABCDEF (大文字化)

echo ${TEXT,,}
#=>abcdef (小文字化)

echo ${TEXT~~}
#=>ABCdef (反転)

# tr を使う昔ながらの手段
echo $TEXT | tr '[:upper:]' '[:lower:]'

文字列中に特定文字列の存在確認
#!/bin/sh

# [[ 文字列 =~ 探したい語句 ]]
# 正規表現も使えます
 
GF=やっぱり苗ちゃんが一番だけどむったんも可愛い

if [[ $GF =~ 苗ちゃん ]]; then
    echo 苗ちゃん見つけた!
else
    echo 苗ちゃんはいなかった...
fi

配列
配列というと C 言語のものを想像しますがまったく違いかなり使い辛い。
大半が $IFS 区切りの文字列で充分ですが一応知識だけでも。
#!/bin/sh

# 配列の作成、括弧で囲む
array=(先頭 次の項目 最後)

# echo してみる、インデックス指定無しだと先頭が出力される
echo $array
#=> 先頭

# インデックスは C 言語と同様、ただし中括弧が必要
echo ${array[1]}
#=> 次の項目

# += で追加できる、括弧で囲む必要あり
array+=(追加)

# インデックスを使って追加や書き換えできる
array[2]=三番目

# 範囲は関係ない、インデックスは並び順ではなく番号
array[10]=九番目
echo ${array[10]}
#=> 九番目

# 単なる未定義になる
echo 百番目は ${array[100]} です
#=> 百番目は です

# ポインタではない
array[4]=${array[0]}
array[0]=最初
echo ${array[4]}
#=> 先頭

# 全てを出力する時は @ を指定
# for item in "${array[@]}"; do
# にてループ文に使える
echo ${array[@]}
#=> 最初 次の項目 三番目 追加 先頭 九番目

# こんな初期化もできる
new_array=([1]=456 [2]=789 [0]=123)
echo ${new_array[@]}
#=> 123 456 789
Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.