これら2つのパラメータがbashに設定されているかどうかを確認するには? [閉鎖]

これら2つのパラメータがbashに設定されているかどうかを確認するには? [閉鎖]

実行可能なbashファイルがあるとしましょうscript.sh

次のように使いたいです。

./script.sh p1 p2

p1p2コマンドの2つの必須パラメータ。これらのいずれかが欠落している場合、コマンドは失敗します。

したがって、続行する前に確認する必要がありますscript.sh。すべて設定されているかどうかを確認できますか?

修正する:

私はこれを試しました:

# this is a comment line
if [ -n "$1" ] || [ -n "$2" ]; then
    then echo 'haha'
fi

しかし、以下を得る:

./_scp.sh: line 3: syntax error near unexpected token `then'
./_scp.sh: line 3: `    then echo 'haha''

答え1

POSIXシェルで2つのパラメータが設定されていることを確認するには、次の手順を試してください。

if [ "$#" -lt 2 ]; then
  echo >&2 'Need 2 parameter'
  exit 1
fi

null以外の2つのパラメータが必要な場合は、-z代わりに使用する必要があります-n-n長さがゼロでないことをテストし、-z長さがゼロであるかどうかをテストします。

if [ -z "$1" ] || [ -z "$2" ]; then
  echo >&2 'Need 2 parameters which are not empty'
  exit 1
fi

bash(andkshと)を使用すると、zsh次のことができます。

[ -v var ] && echo var was set

変数がvar設定されていることを確認してください。

$ [ -v var ] && echo var was set
$ var=
$ [ -v var ] && echo var was set
var was set

ただし、変数の代わりにという別の種類のパラメータであること$1に注意してください。$2位置パラメータ[ -v 1 ]最初の位置パラメータが設定されていることを確認することはzshorでは有効ですmkshが、bashnorでは無効ですksh93

答え2

スクリプトを失敗させることができます。

#!/bin/bash
: "${2:?} ${1:?}"
#If either one of the above is unset or null the 
#script will have already exited with a meaningful
#diagnstic message written to standard error.

シェルはエラーで終了し、自動的にメッセージを生成します。正確に言えば、シェルによって異なりますが、通常は次のようになります。

(set --; ${1:?})
sh: 2: 1: parameter not set or null

...どこ最初のコロンはフィールドを区別します。はい$0、次は$LINENO変数名、ついに診断メッセージ。過去にも同様のメッセージを見たことがあります。

診断メッセージに関する特定の情報を取得できます。

(set --; ${1:?Hi there!})
sh: 3: 1: Hi there!

また、これはインライン暗黙のテストです。ターゲットパラメータの場合はい設定されていて空ではありません:(または:?パラメータ拡張構文からコロンが削除された場合はnullかもしれません)、正常に拡張されます。

(set param; echo "${1:?This better not be empty!}")
param

これは他の形態の修正と同じである。パラメータ拡張、位置だけでなく他の種類のパラメータにも適用できます。

param= bash -c '
    printf "Sure hope this works...\n" "${param:?Not a chance!}"
    echo ... but what about me\?
'   newzero
echo "RETURN: $?"

...私の端末に印刷...

newzero: line 1: param: Not a chance!
RETURN: 127

オプションの診断メッセージはそれ自体の拡張です。拡張する内容に関係なく、シェルはstderrに書き込みます。--helpスクリプトにオプションの解析を追加するときは、ほとんどの場合メッセージに使用します。私はちょうど小さな関数を作成し、問題が発生したときに予想された番号付き引数を渡しました。

#script and more script
help(){ eval "\${$param:?\$(cat)}"; } <<HELP
Usage [ and the usual ... ]
HELP

while getopts ....
do    case $opt in ($myopts) :;;
      (*) param=$OPTIND help;;esac
done

関連情報