ソーススクリプトに渡されたパラメータが無効です。

ソーススクリプトに渡されたパラメータが無効です。

渡された引数の数を確認し、誤った場合に警告するAIXのスクリプト: -

if [ "$#" -ge 1 ]; then
  ...
else
  echo 'Usage: myscript <a> [b] [c]'
fi

スクリプトはそれを取得するためにいくつかの環境変数を設定します。つまり、コマンドラインに次のように入力します。 2番目のスクリプトはありません。他のスクリプトからスクリプトをインポートしません。

. ./myscript.sh

引数を渡さない場合は、usingステートメントを印刷したいのですが、前のコマンドに渡された引数を使用して実行します(必ずしもこのスクリプトである必要はありません!)。

これを再確認するために、スクリプトの先頭に次の行を追加して、これが真実であることを証明しました。

echo $# $@

パラメータを渡さないと、以前のソーススクリプトのパラメータ数とリストが印刷されます。

0個の引数を渡して再インポートするときに0になるにはどうすればよいですか$#

可能な最小の再作成はスクリプトなので:-

myscript.sh

echo $# $@

それから実行してください: -

. ./myscript.sh a b c

印刷する

3 a b c

その後、引数なしで再実行してください。

. ./myscript.sh

同じ結果を出力する

3 a b c

印刷すると予想される場合

0

スクリプトを取得できず、直接実行する場合:-

./myscript.sh

その後、期待どおりに動作し、印刷されます。

0

これが現在の問題を明確にすることを願っています。

上記の方法がなぜ機能しないのかを説明する答えはたくさんあり、どうすべきかに対する答えはないようで、もう一度試してみて、私が何をしたいのかを説明しなければならないと思いました。

必要

少なくとも1つの引数を必要とするスクリプトを作成し、その引数として呼び出されない場合は文句を言います(上記の質問の最初のコード部分を参照)、スクリプトはいくつかの環境変数を設定する必要があります。 2番目の要件のため、スクリプトが完了したときに環境変数が設定され続けるようにスクリプトをインポートする必要があるとします。パラメータが渡されていない時期を伝え、環境変数も設定するスクリプトをどのように作成しますか?

ベストアンサー1

存在する

. path/to/script at least one argument

他の人が言ったように、シェルによっては、これらの追加パラメータは無視されるか(Bourne、Almquist)、スクリプトが解釈されたときに現在の位置パラメータセット($@、、$1...)を置き換えます(他のほとんどのシェル)。$2POSIXは、追加の引数がに渡されるときの動作を指定しません.。この場合、set a bスクリプトの位置パラメータ(たとえば)への変更が完了後も保持されるかどうかについて、シェル間に若干の違いがあります.

存在する:

. path/to/script

ただし、動作が指定されます。位置パラメータが必要です。いいえ影響を受けるため、スクリプトの解釈は以前と同じままです。

このスクリプトの解釈中に位置パラメータを空のリストにするには、事前にリセットするか、次の関数を使用する必要があります。

set -- # or shift "$#"
. path/to/script

(位置パラメータは失われますが)または次の機能を使用してください。

dot() { file=$1; shift; . "$file"; }
dot path/to/myscript

コマンドを実行すると、.位置パラメーターは関数の位置パラメーターになります。後でshift関数に渡される引数から最初の引数を引いた値になるので、上記は空のリストですが、これは関数を使用すると、任意の引数リストをソーススクリプトに渡すことができることを意味します。

dot path/to/myscript extra args

これはソーススクリプトで提供されていますextra args$1$2

myscript呼び出しが位置引数のリストを変更すると、関数の位置引数のみがset影響を受け、これらの変更は関数が返された後も保持されません。

おすすめ記事