実行可能なbashファイルがあるとしましょうscript.sh
。
次のように使いたいです。
./script.sh p1 p2
p1
とp2
コマンドの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 ]
最初の位置パラメータが設定されていることを確認することはzsh
orでは有効ですmksh
が、bash
norでは無効です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