コマンド置換を使用してスクリプトをインポートすると、無効なパラメータが渡されました。

コマンド置換を使用してスクリプトをインポートすると、無効なパラメータが渡されました。

print.shスクリプトがあります。

#!/bin/bash
echo printing provided args:

for i in "$@"; do
        echo -e "\t${i}"
done

メッセージが表示されたときにこれを実行すると、リポジトリの出力がa=$(. print.sh ); echo "${a}" 得られます。printing provided args:

コマンド代替テスト用の基本スクリプトは次のとおりです。

#!/bin/bash
function func_to_call_sub_scrp
        {
        # Call  sub-script
        capture="$(. $1  $2 $3)"
        echo -e "captured output:
\t\t${capture}"
        }

echo "Run function to call sub script without parameters passed. "
func_to_call_sub_scrp   print.sh
echo ""
echo "Run function to call sub script with parameters passed."
func_to_call_sub_scrp   print.sh     xx  yy

この出力は次のようになります。

Run function to call sub script without parameters passed. 
captured output:
                printing provided args:
        print.sh

Run function to call sub script with parameters passed.
captured output:
                printing provided args:
        xx
        yy

2番目の呼び出しは、期待どおりにxxとyyをprint.shに送信します。ちなみに、 "print.sh" """"コマンド置換を送信すると、 ""と ""を送信する代わりにprint.shが呼び出され、$ 1に送信されます。

私の質問は、他の入力がない場合に$ 1を印刷スクリプトにパラメータとして渡す方法です。私はまた戻ってくる"$(. $1 $2 $3)"ことを楽しみにしています。"$(. print.sh )""printing provided args:"

答え1

お願いします。いいえ. "print.sh" "" ""最初の例を実行します。参照または. print.shがないため実行中です。$2$3

bashマニュアルでsource(および.)について以下を強調します。

[...] 引数が指定された場合、filename の実行時に位置引数になります。 それ以外の場合、位置パラメータは変更されずにそのまま残ります。

を呼び出すときに. print.shドットスクリプトに引数を提供しないため、print.sh位置引数は変更されずに保持されます。しかし、それらは何ですか?

ドットスクリプトの位置引数は、最初の呼び出しで単一の文字列リストである関数の位置引数になりますprint.sh。これがドットスクリプト内で"$@"拡張が行われる理由です。print.sh


ちょうどコメント:

タブインデントを使用してすべての位置引数を出力するより良い方法:

printf '\t%s\n' "$@"

これにより、echo説明した問題を回避できます。他の場所で。関数がどのように出力されるかについても$capture同様の説明をすることができます。

$1また、シェルが文字ごとに分割し、結果の単語にファイル名のグロービングを適用したくない限り、引用符、およびへ$2の拡張も必要です。バラより$3$IFSいつ二重引用符が必要ですか?

関連情報