シェルスクリプト(if文)

OKWave 2007年10月15日 10時00分

  • このエントリーをはてなブックマークに追加
シェルスクリプト(if文)

bashにてシェルスクリプトを作成しています。

XXXX_111122222333_YYYYMMDD 111122222333

といった2パターンのファイル名から、「111122222333」の部分を取得したいのですが、if文の条件式で悩んでいます。


if [ expr length ${p9} -gt 13 ]
then
a=`echo $p9|cut -c 6-9`
b=`echo $p9|cut -c 10-14`
c=`echo $p9|cut -c 15-18`
else
a=`echo $p9|cut -c 1-4`
b=`echo $p9|cut -c 5-9`
c=`echo $p9|cut -c 10-13`
fi

これで実行すると too many arguments というエラーが出てしまいます。(結果も正しくありません)
基本的な部分が理解できていないかと思うのですが、宜しくお願いいたします。

良回答

すみません、修正します。

> let len=`echo ${p9} | wc -c`-1

len=`echo -n ${p9} | wc -c`

の方が良いです。

回答

パターンの定義が不明ですが、

  • 取得したい値は、必ず「_(アンダーバー)」に挟まれている。
  • 「_(アンダーバー)」は、取得したい値の両端にあり、2つ以上存在しない。
  • 「_(アンダーバー)」が含まれていない場合は、評価する値は取得したい値そのものである。

であるならば、「_(アンダーバー)」をスペースに置き換えて、配列に入れてしまえば操作が楽だと思います。


◯パターン1
$ a=XXXX_111122222333_YYYYMMDD
$ b=( ${a//_/ }) aの内容で""_""を"" ""スペースに置き換えて、配列bに入れる
$ declare -p b 配列bの各要素の値を確認
declare -a b='([0]=""XXXX"" [1]=""111122222333"" [2]=""YYYYMMDD"")'
$ echo ${#b[@]} 配列bの要素の数
3 
$ echo ${b[1]} 2番目の要素の表示
111122222333


◯パターン2
$ a=111122222333
$ b=( ${a//_/ })
$ echo ${#b[@]}
1
$ echo ${b[0]} 
111122222333

評価したい値がどちらのパターンかは、配列の要素数で判断して、
b[1]かb[0]を最終的な値にすればいいですね。

あとは、スクリプトにするだけ。

・Bash 2.05以上で使えます。
・${変数名:オフセット:長さ}の形式で部分抽出することも出来そうですが、
複数回の評価が必要になるの・汎用的でない(数値の埋め込みが多くなる)ので、${変数名//パターン/置換文字列}にしました。
・外部コマンドを実行しないので(チョットだけ)早いです。

shスクリプトの書籍を紹介しておきます。
「シェルスクリプト基本リファレンス」[技術評論社](ISBN4-7741-2261-0)は、
shスクリプトの移植性に配慮された数少ない書籍で、shスクリプトを作り時には
手元に置いておきたい一冊だと思います。

ZDNet Japan 記事を毎朝メールでまとめ読み(登録無料)

  • このエントリーをはてなブックマークに追加

この記事を読んだ方に

関連キーワード
OS

連載

CIO
デジタル“失敗学”
IT部門の苦悩
Rethink Internet:インターネット再考
インシデントをもたらすヒューマンエラー
トランザクションの今昔物語
エリック松永のデジタルIQ道場
研究現場から見たAI
Fintechの正体
米ZDNet編集長Larryの独り言
大木豊成「仕事で使うアップルのトリセツ」
山本雅史「ハードから読み解くITトレンド放談」
田中克己「2020年のIT企業」
松岡功「一言もの申す」
松岡功「今週の明言」
内山悟志「IT部門はどこに向かうのか」
林 雅之「デジタル未来からの手紙」
谷川耕一「エンプラITならこれは知っとけ」
大河原克行「エンプラ徒然」
内製化とユーザー体験の関係
「プロジェクトマネジメント」の解き方
ITは「ひみつ道具」の夢を見る
セキュリティ
「企業セキュリティの歩き方」
「サイバーセキュリティ未来考」
「ネットワークセキュリティの要諦」
「セキュリティの論点」
スペシャル
ざっくりわかるSNSマーケティング入門
課題解決のためのUI/UX
誰もが開発者になる時代 ~業務システム開発の現場を行く~
「Windows 10」法人導入の手引き
ソフトウェア開発パラダイムの進化
エンタープライズトレンド
10の事情
座談会@ZDNet
Dr.津田のクラウドトップガン対談
Gartner Symposium
IBM World of Watson
de:code
Sapphire Now
VMworld
Microsoft WPC
Microsoft Connect()
HPE Discover
Oracle OpenWorld
Dell EMC World
AWS re:Invent
AWS Summit
PTC LiveWorx
吉田行男「より賢く活用するためのOSS最新動向」
古賀政純「Dockerがもたらすビジネス変革」
中国ビジネス四方山話
ベトナムでビジネス
米株式動向
日本株展望
企業決算
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]