編集部からのお知らせ
「半導体動向」記事まとめ
「リスキリング」に関する記事まとめ

シェルスクリプト(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 記事を毎朝メールでまとめ読み(登録無料)

特集

CIO

モバイル

セキュリティ

スペシャル

ホワイトペーパー

新着

ランキング

  1. 開発

    なぜ、コンテナー技術を使うことで、ビジネスチャンスを逃さないアプリ開発が可能になるのか?

  2. セキュリティ

    2022年、セキュリティトレンドと最新テクノロジーについて、リーダーが知っておくべきこと

  3. ビジネスアプリケーション

    全国1,800人のアンケートから見えてきた、日本企業におけるデータ活用の現実と課題に迫る

  4. 運用管理

    データドリブン企業への変革を支える4要素と「AI・データ活用の民主化」に欠かせないテクノロジー

  5. 経営

    テレワーク化が浮き彫りにしたリソース管理の重要性、JALのPCセットアップを支えたソフトウエア

NEWSLETTERS

エンタープライズ・コンピューティングの最前線を配信

ZDNet Japanは、CIOとITマネージャーを対象に、ビジネス課題の解決とITを活用した新たな価値創造を支援します。
ITビジネス全般については、CNET Japanをご覧ください。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]