sh - .profile関数で引数を使用する

sh - .profile関数で引数を使用する

.profileファイルで生成された関数にパラメータを使用したいと思います。

パラメータが指定されていない場合は入力を要求し、そうでない場合は変数を$ 1に設定したいと思います。

$ 1が空であることを確認すると、次のエラーが発生します。

sh[7]: 1: Parameter not set.

次の行から:

if [ ! -n "$1" ]; then

bashの代わりにshを使用しています。

編集:良いです。 ifステートメントの終わりまでの最初のコード行は次のとおりです。

HOST=`hostname`
cd /opt/dirpath
ll *.sto


if [ x"$1" = x ]; then
  # Ask for input
  echo "File: \c"; read outFile
else
    outFile=$1
fi

パラメータを有効または無効にするために他の人のコードを編集しています。

答え1

私はこれに多くがあると思います:

これは、使用中のコマンドではないか、関数の他の場所で別の方法で実行しています。エラーはで発生します${1?}。または、テストで発生したが最初にそうした場合にのみ発生しますset -u

この問題を解決するには、この操作を停止してください。このset +u; fn_nameようにして何が起こるのかを見てください。拡張機能がある場合、${1?}関数にパラメータを提供するまでこのエラーは消えません。

以下は、エラーを再現する方法のいくつかのコード例です。

sh -c 'fn(){ [ ! -n "${1?}" ]; }; fn'
sh: 1: 1: parameter not set

...または...

sh -uc 'fn(){ [ ! -n "$1" ]; }; fn'
sh: 1: 1: parameter not set

...しかし...

sh -uc 'fn(){ [ ! -n "$1" ]; }
        set +u; fn; echo "$?"'
0

...そして...

sh -c 'fn(){ [ ! -n "${1?}" ]; }
       fn some args; echo "$?"'
1

機能が設定されている場合は、その機能を編集する必要が-uあります。そうでなければ、そうしても.profile同じです。ほとんどの場合はset -uそうです。いいえ継続的なシェル設定に最適です。これはモードが次のようになるためです。デザイン済み殻を殺す生成されるエラーの種類を処理する簡単な方法はありません。これは正確に[testでやりたいことです]

関連情報