質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

csh

cshは、C言語スタイルの構文を持つUNIX系OSのシェルの1つのことです。

Q&A

3回答

1308閲覧

cshで引数がYYYYMMDDHHMISSの形式か判定したい

letprog

総合スコア5

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

csh

cshは、C言語スタイルの構文を持つUNIX系OSのシェルの1つのことです。

0グッド

0クリップ

投稿2020/02/24 00:52

前提・実現したいこと

csh実行時に引数を受け取り、それが日時の形式(YYYYMMDDHHMISS)かどうか判定するコードを書いています。

該当のソースコード

まず、はじめに以下のようにコードを記載しましたが、引数にAAAABBCCDDEEFFといった数字以外の文字を引数に指定するとif文でエラーとなってしまいます。

echo $1 | grep `[1-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9][0-2][0-9][0-5][0-9][0-9]` >& /dev/null if($status != 0) then echo "引数が日時ではない" endif

何が原因か、どなたかこ教示をお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/02/24 01:20

`[0-9]`(バッククオート)ではなく、'[0-9]'(シングルクオート)を使いましょう。あと、一桁足りてない気が…。
Y.H.

2020/02/26 00:22

> if文でエラーとなってしまいます エラーは省略せずそのまま質問に記載しましょう。
otn

2020/04/04 09:54

放置?
guest

回答3

0

csh思い出せないのでサンプルはbashで書きます。すいません。
入力をsedで日付風文字列に変換し、dateコマンドが解釈できるかどうかで判断してみてはいかがでしょうか。

bash

1$ cat hoge.sh 2#/bin/bash 3for text in $( 4cat <<EOD 520300405060708 620309405060708 720300495060708 820300405960708 920300405069708 1020300405060798 1120300101000000 1220301231235959 1320200229235959 1420210229235959 15EOD 16) 17do 18 datestring=$(echo $text | sed -e 's/(....)(..)(..)(..)(..)(...*)/\1-\2-\3 \4:\5:\6/') 19 date --date="$datestring" >/dev/null 2>&1 ; rc=$? 20 echo $text : rc = $rc 21done

うるう年判定もちゃんとやってくれます。dateコマンドはうるう秒(60秒)も扱えるようですが、解析までちゃんとできるかどうかは未確認です。

$ sh hoge.sh 20300405060708 : rc = 0 20309405060708 : rc = 1 20300495060708 : rc = 1 20300405960708 : rc = 1 20300405069708 : rc = 1 20300405060798 : rc = 1 20300101000000 : rc = 0 20301231235959 : rc = 0 20200229235959 : rc = 0 20210229235959 : rc = 1

投稿2020/02/25 15:06

shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ゴリ押しですが下記で日時の判定+日時に文字が入ってないことを確認するスクリプトです

endifが2個入っているのはelseに入った場合抜ける時にendif not foundが出力されるからです(自分だけなのかは不明)

下記はCentOS7,cshで確認しています

csh

1#!/bin/csh 2set line = `echo $1 | egrep -o '[0-9]+' | wc -l` 3set text = `echo $1 | egrep -o '[0-9]' | tr -d '\n'` 4set len = `expr length $text` 5set yyyy = `echo $1 | head -c 4` 6set MM = `echo $1 | head -c 6 | tail -c 2` 7set DD = `echo $1 | head -c 8 | tail -c 2` 8set hh = `echo $1 | head -c 10 | tail -c 2` 9set mm = `echo $1 | head -c 12 | tail -c 2` 10set ss = `echo $1 | head -c 14 | tail -c 2` 11 12if ( $line == 1 && $len == 14 && $yyyy >= 1900 && $yyyy <= 9999 && $MM >= 1 && $MM <= 12 && $DD >= 1 && $DD <= 31 && $hh >= 0 && $hh <= 23 && $mm >= 0 && $mm <= 59 && $ss >= 0 && $ss <= 59 ) then 13 echo "OK" 14else 15 echo "NG" 16 endif 17endif

投稿2020/02/24 05:30

編集2020/02/24 06:26
abratani

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

 ^[1-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9][0-2][0-9][0-5][0-9][0-5][0-9]$ # ^ ^ ^ # | | +-- 追加 # +-- 追加 +-- [0-5] を追加

上記でとりあえず__かなり大雑把__には判定はできますが、このままでは例えば、20201939295959(2020年19月39日29時59分59秒)のような、おかしな日時でもOK判定が出てしまいます。これらもエラーと判定したい場合、別途対策をする必要があります。

投稿2020/02/24 01:36

yukkeorg

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問