シェルスクリプト(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スクリプトを作り時には
手元に置いておきたい一冊だと思います。
記事提供:OKWave
「Solaris系OS」 のバックナンバー
-
mailxとsendmailは別のもの?
古いシステムで、メール送信にmailxコマンドを使用しています。sendmailを脆弱性の理由で、止めたいのですが、sendmailデーモンを止めても、mailxコマンドには影響ないですか? -
Solaris9の時間がずれました
-
cronに登録していたアプリケーションが起動できなくなりました
-
Sun製サーバでntp関連パッチが当てられているかどうかを知りたい
-
Solaris10でツールのインストールが出来ず困っています
- Solaris系OS 一覧へ »
ホワイトペーパー
ZDNet Japan Essential Topic
-
【今注目のIT企業は何を考える…??】
オススメIT系求人情報も毎週月曜日更新! -
コラボレーション基盤特集
Notes置換とバージョンアップの情報はこちら
企画特集
[PR]
-
ZDNet Japan Green IT
サミットだけでは終わらせない!エンタープライズの取り組みはこれからだ! -
APC SOLUTIONS FORUM 2008をレポート
電源、冷却の効率化によるエネルギー削減とは? -
サーバ仮想化・グリーン化の利点を最大化!
多機能・高価値なNetAppストレージの秘密とは -
KDDI「SaaSソリューション」
〜社内コミュニケーションの課題への解決策とは〜 -
「シンプル」&「低コスト」な運用管理
IT運用管理に関するアンケート実施中! -
ログ管理ソリューション特集
セキュリティ、コンプライアンス対策で注目度アップ! -
ZDNet Japan ホスティング特集
2008年夏のホスティングサービスのトレンドは何? -
セキュリティ対策レベルテスト公開!
自社のセキュリティのウイークポイントはドコ? -
Techno Exchange
RackableとCTCの地球にやさしい関係 -
Webセキュリティ特集
Web2.0時代の脅威へ対抗するためのソリューションとは? -
Secure Web
Web2.0時代にプロアクティブなセキュリティを実現!! -
【ログ管理】Logstorage、SecureEagle/SIM
内部統制のためのソリューションを紹介! -
IronPort Sシリーズ
Webからの脅威に関する課題の3つの解決方法
ZDNet Japan イベント
- 開催日:2008年9月29日(月)
- イベント一覧へ»