![これら2つのパラメータがbashに設定されているかどうかを確認するには? [閉鎖]](https://linux33.com/image/62449/%E3%81%93%E3%82%8C%E3%82%892%E3%81%A4%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%8Cbash%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
実行可能な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