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 というエラーが出てしまいます。(結果も正しくありません)
基本的な部分が理解できていないかと思うのですが、宜しくお願いいたします。
No.1
- 回答日時:
exprは使ったことが無かったのですが、if文の中に入れるとうまくいかないみたいです。
なので、処理を分けて、len=`expr length ${p9}`
if [ $len -gt 13 ]
then
a=`echo $p9|cut -c 6-9`
b=`echo $p9|cut -c 10-14`
c=`echo $p9|cut -c 15-17`
else
a=`echo $p9|cut -c 1-4`
b=`echo $p9|cut -c 5-9`
c=`echo $p9|cut -c 10-12`
fi
の様に書けば宜しいかと。
ご回答いただきありがとうございます。
早速教えていただいた通りしてみたのですが、やはりエラーになります。
expr: 構文エラー
expr がなぜ構文エラーなのでしょうか??
manやネットで調べてみたのですが、そのような記述は見当たりません。
ご存知でしたら教えていただけますでしょうか?
お手数をお掛けします。。
No.2
- 回答日時:
> expr: 構文エラー
expr --help や、expr --version を実行して、expr がサポートする書式やバージョンの確認をお願いします。expr length ??? をサポートしていない可能性もありますので。
もしサポートされていなければ、仕方がありませんから、
let len=`echo ${p9} | wc -c`-1
と言った代替手段を使うしかないでしょう。
No.4
- 回答日時:
パターンの定義が不明ですが、
・取得したい値は、必ず「_(アンダーバー)」に挟まれている。
・「_(アンダーバー)」は、取得したい値の両端にあり、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スクリプトを作り時には
手元に置いておきたい一冊だと思います。
ご回答ありがとうございます。
すごく丁寧にご説明いただいてありがとうございます。
勉強になりました。
紹介していただいた書籍、早速探してみたいと思います。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- PHP PHP MySql ページング 2 2022/09/20 06:38
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
- その他(プログラミング・Web制作) 単純なコマンドプロンプトが動きません。 2 2022/04/19 15:21
- UNIX・Linux bashの変数でブランクがあるかチェックする方法教えて下さい。 3 2023/04/06 16:09
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- その他(プログラミング・Web制作) zshの例外処理 1 2022/06/02 16:36
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
telnet へのパイプができないです
-
シェルの実行について
-
時間を計算する方法
-
実行中のシェルスクリプト自体...
-
シェルスクリプト(if文)
-
FTPコマンドの戻り値について
-
Viで書き込もうとすると、保...
-
scpコマンドでリモートサーバの...
-
/ が何時の間にか「Read-only f...
-
メールサーバの/var/spool/mail...
-
属性変更できないです。
-
Macの Terminal でのエラーと...
-
CPUのbit数を調べるコマンド
-
ウィンドウズお自動起動後、ラ...
-
cactiでグラフが表示されない
-
書き込み権限が無いためコピー...
-
別名でリンク先を保存。
-
FTP接続中のコマンド実行結果を...
-
snmpでMIB取得
-
USBハードディスクのnfsでのエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド終了ステータス
-
FTPコマンドの戻り値について
-
cshで変数名の入れ子ができない
-
lsコマンドの色設定が反映されない
-
diskpart でパーティションの一...
-
実行中のシェルスクリプト自体...
-
Mac OSXのターミナルでemacsを起動
-
cronでftp自動転送を行いたい
-
telnet へのパイプができないです
-
cshの標準出力を制御したい
-
複数の処理を順番にログアウト...
-
vagrant upでエラーが表示され...
-
UNIX Cシェルで実数の比較
-
kshでのcase文条件範囲について
-
空白を含んだシェル変数の代入
-
shellから起動したkterm上でコ...
-
PHP4の Warning: pg_freeresul...
-
メニュー画面よりコマンド実行...
-
リモートシェルでファイルをroo...
-
cygwinシェルスクリプト内での...
おすすめ情報