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

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

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

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

Q&A

解決済

2回答

1751閲覧

bash シェルスクリプト実行時の引数のエラーハンドリング

noz_awsinf_sp

総合スコア63

bash

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

0グッド

0クリップ

投稿2021/04/19 09:27

test.shの引数を以下3パターン検討しているのですが
その場合のエラーハンドリングで愚直な方法は思う浮かんだとですが
他にきれいな記載方法あれば教えていただきたいです。

  • -a は引数なしで動作
  • -b は第一引数のみ (オプションが-bの場合は、第一引数があるかチェック)
  • -c は第一、第二引数 (オプションが-cの場合は、第一引数 or 第二引数があるかチェック)
$ ./test.sh -a $ ./test.sh -b "b" $ ./test.sh -c "c" "cc"
#!/bin/bash first=$1 second=$2 third=$3 if [ $first=="-a" ]; then echo OK if [ $first == "-b" ]; then if [ -z $second ]; then echo -b引数エラー exit 250 fi elif [ $first == "-c" ]; then if [ -z $second ] || [ -z $third ]; then echo どちらか不足 second : $second third : $third exit 250 fi fi else echo オプションエラー fi while getopts ab:c: OPT do case $OPT in a) echo "-a " ;; b) echo "-b = ${OPTARG}" ;; c) echo "-c = ${OPTARG}" ;; esac done

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

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

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

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

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

guest

回答2

0

ベストアンサー

エラー情報的には少なくなりますが、個人的にはこういうのが分かりやすくていいなと思います。

bash

1#!/bin/bash 2if [ $# -eq 0 -o $# -gt 3 ]; then 3 echo "オプションエラー" 4 exit 5fi 6 7case $1 in 8"-a") n=1;; 9"-b") n=2;; 10"-c") n=3;; 11*) echo "オプションエラー" 12 exit;; 13esac 14 15if [ $# -ne $n ]; then 16 echo "引数エラー" 17 exit 18fi 19 20#以下略

投稿2021/04/19 10:57

takasima20

総合スコア7468

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

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

0

こんな感じでしょうか。

Bash

1while getopts ab:c: OPT 2do 3 case "$OPT" in 4 a) opt_a=1 5 ;; 6 b) opt_b="$OPTARG" 7 ;; 8 c) opt_c_1="$OPTARG" 9 if [ "$OPTIND" -gt $# ] 10 then echo $0: オプションには引き数が2つ必要です -- c >&2 ; exit 1 11 fi 12 eval opt_c_2="$$OPTIND" 13 let OPTIND++ 14 ;; 15 "?") exit 1 16 ;; 17 esac 18done 19shift $((OPTIND - 1)) 20 21echo "opt_a=$opt_a" 22echo "opt_b=$opt_b" 23echo "opt_c_1=$opt_c_1" 24echo "opt_c_2=$opt_c_2" 25echo "others=$@"

投稿2021/04/19 10:04

編集2021/04/19 10:05
otn

総合スコア86289

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問