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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

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

シェル

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

3回答

647閲覧

シェルスクリプトで、すべてのオプションパラメータが空でないことを確認する方法

umino

総合スコア54

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

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

シェル

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2020/02/13 10:07

前提・実現したいこと

下記ソースコードのようにシェルスクリプトで、
オプションから受けたパラメータの妥当性をチェックしたいと思っています。

●チェックしたいこと
1.パラメータ数は正しいか?
2.すべてのパラメータの中身は空でないか?(1つでも空文字の場合はエラー)

1で数をチェックしても、「-a 1 -a 2 -b 3 ...」 のように1つのオプションを複数回指定した場合、1のパラメータ数チェックは通ってしまいます。
ですから、2の処理が必要と考えています。

該当のソースコード

sh

1## パラメータチェック 2# IFパラメータを受けているかチェック 3while getopts "a:b:c:d:e:f:g:h:" OPT 4 do 5 case $OPT in 6 a ) apple=$OPTARG;; 7 b ) banana=$OPTARG;; 8 c ) chicken=$OPTARG;; 9 d ) donut=$OPTARG;; 10 e ) egg=$OPTARG;; 11 f ) fish=$OPTARG;; 12 g ) grape=$OPTARG;; 13 h ) hamburger=$OPTARG;; 14 esac 15 done 16 17# 1.パラメータ数は正しいか? 18if [ $# != 16 ];then 19 exit 1 20fi 21 22# 2.すべてのパラメータの中身は空でないか?(1つでも空文字の場合はエラー) 23for 24 do 25 ******************************* 26 done 27 28

こちらについてよい書き方をご存じの方、ご教示願えませんでしょうか。
どうぞよろしくおねがいします。

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

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

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

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

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

umino

2020/02/13 10:38

すみません、長らくこねまわしているうちに忘れ&わからなくなってしまい、同じような質問をしてしまいました。 こちらで解決できますね。 修正依頼ありがとうございました。ごめんなさい。
umino

2020/02/14 01:14 編集

Y.Hさん 何度もすみません。以前教えていただいた件ですが、変数名などを変更して実行してみたところ、思うように動きませんでした。 わたしが勘違いをしていると思うのですが、どこが間違っているかおわかりになれば教えていただけませんでしょうか? ●ソースコード ## パラメータチェック # IFパラメータを受けているかチェック while getopts "a:b:c:d:e:f:g:h:" OPT do case $OPT in a ) apple=$OPTARG;; b ) banana=$OPTARG;; c ) chicken=$OPTARG;; d ) donut=$OPTARG;; e ) egg=$OPTARG;; f ) fish=$OPTARG;; g ) grape=$OPTARG;; h ) hamburger=$OPTARG;; esac done # 1.パラメータ数は正しいか? if [ $# != 16 ];then exit 1 fi # 2.すべてのパラメータの中身は空でないか?(1つでも空文字の場合はエラー) ## IF空文字チェック for v in $apple $banana $chicken $donut $egg $fish $grape $hamburger do if [ -z $v ]; then echo "${v^^}が空文字です。" exit 1 fi done ●実行時のコマンド sh hoge.sh -a 1 -b 2 -c 3 -d 4 -e 5 -f 6 -g 7 -g 8 ↑8番目の-hオプションがない(-gを重複して投入した)。 -hオプションで渡す変数humburgerの中身は空なので、if分岐に入って終了(エラーにしたい)と思うのですが、入りませんでした。 どこが誤っているか、教えていただければ幸いです。 何度もすみません。
guest

回答3

0

bash

1#!/bin/bash 2while getopts "a:b:c:d:e:f:g:h:" OPT 3 do 4 case $OPT in 5 a ) apple=$OPTARG;; 6 b ) banana=$OPTARG;; 7 c ) chicken=$OPTARG;; 8 d ) donut=$OPTARG;; 9 e ) egg=$OPTARG;; 10 f ) fish=$OPTARG;; 11 g ) grape=$OPTARG;; 12 h ) hamburger=$OPTARG;; 13 esac 14 done 15 16# 1.パラメータ数は正しいか? 17if [ $# != 16 ];then 18 exit 1 19fi 20 21for v in "apple" "banana" "chicken" "donut" "egg" "fish" "grape" "hamburger" 22do 23 eval val=$${v}; 24 if [ -z $val ]; then 25 echo "${v}が空文字です。" 26 exit 1 27 fi 28done

console

1$ ./test.sh -a 1 -b 2 -c 3 -d 4 -e 5 -f 6 -g 7 -g 8 2hamburgerが空文字です。

投稿2020/02/14 01:29

Y.H.

総合スコア7914

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

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

umino

2020/02/14 01:47

Y.Hさん 正しく実行できました。 evalで引数を変数として、その変数を判定する、の順ですね。 for文から変数を指定して実行しようとしてました。 まぬけな誤りを正していただいてありがとうございました。 大変助かります。
guest

0

これでどうでしょうか(ファイル名=test2.bash)。なお、optsはa~dの4個に簡略化しました。

bash

1#!/usr/bin/bash 2opts_counter=0 3while getopts "a:b:c:d" OPT 4 do 5 case $OPT in 6 a ) apple=$OPTARG 7 let ++opts_counter 8 ;; 9 b ) banana=$OPTARG 10 let ++opts_counter 11 ;; 12 c ) chicken=$OPTARG 13 let ++opts_counter 14 ;; 15 d ) donut=$OPTARG 16 let ++opts_counter 17 ;; 18 esac 19 done 20if [ "$opts_counter" = 4 ] ; then 21 echo "all opts specified" 22else 23 echo "not enough opts" 24fi

実行結果(シェル名=test.bashとしました)

term

1$ bash test.bash -a 1 2not enough opts 3 4$ bash test.bash -a 1 -b 2 -c 3 -d 4 5all opts specified

投稿2020/02/13 10:44

ikapy

総合スコア1167

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

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

Y.H.

2020/02/14 01:16

> 1で数をチェックしても、「-a 1 -a 2 -b 3 ...」 のように1つのオプションを複数回指定した場合 この要件が満たされてない気がします。 $ ./test2.sh -a 1 -b 2 -c 3 -a 9 all opts specified
umino

2020/02/14 01:19

ikapyさん 回答いただいてありがとうございます。 let を使う方法があるんですね。はじめて知りました。 実行してみたのですが、 この場合、例えばオプション-dを意図的に渡さないと、↓ $ bash test.bash -a 1 -b 2 -c 3 -c 4 all opts specified となります。(-d,変数donutの中身は空だがエラーにならない) 2.すべてのパラメータの中身は空でないか?(1つでも空文字の場合はエラー) を満たしたいのですが、よい方法はありませんでしょうか? ご回答に感謝します。
ikapy

2020/02/14 02:26

Y.H様の通り、不十分でしたね。申し訳ないです。 連想配列を使えばできるのかなと思いましたが、解決したとのことで・・・
guest

0

自己解決

https://teratail.com/questions/236260
↑こちらの方法でスマートに解決できます。
同じような質問を過去にしていましたが、修正を繰り返すうちに忘れ&わからなくなってしまい、似たような投稿をしてしまいました。すみません。

投稿2020/02/13 10:40

umino

総合スコア54

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問