パラメータを使用して別のスクリプトを生成するスクリプトの作成

パラメータを使用して別のスクリプトを生成するスクリプトの作成

異なるスクリプトを生成するために2つのパラメータを使用するスクリプトを生成したいと思います。 2番目のスクリプトは独自のパラメータを使用する必要があります。私が続けている問題は、最後のエコーが最初のスクリプトの引数を2番目のスクリプトに入れることです。それでは、2番目のスクリプトでパラメータを受け入れるにはどうすればよいですか?これを行う方法を知りたいです。これが最初のスクリプトです。

#! /bin/bash
MY_FILE=$1
MY_PATH=$2
touch $MY_PATH/$MY_FILE
echo "#! /bin/bash" > $MY_FILE
echo "ps -u $1 -o comm=CMD -o pid,ppid,user,uid,gid" >> $MY_FILE

答え1

Bash シェルのマニュアルを読むと、二重引用符は引用符内の文字値をそのまま保持します。とは別に「$」、「`」、「\」の場合。したがって、$12番目のスクリプトでテキスト「$ 1」を印刷する代わりに、作成した行は最初のスクリプトの最初のパラメータに置き換えられます。私はあなたが望むものは次のとおりだと思います。

#! /bin/bash
MY_FILE=$1
MY_PATH=$2
touch "$MY_PATH"/"$MY_FILE"
echo "#! /bin/bash" > "$MY_FILE"
echo `ps -u $1 -o comm=CMD -o pid,ppid,user,uid,gid` >> "$MY_FILE"

また、変数拡張の周りに二重引用符を追加しました"$MY_FILE"。これは、保存された文字列にスペースが含まれている場合の混乱を避けるためです。

しかし、ここで達成しようとしている目標を理解していないと言うべきです。

a)2番目のスクリプトに印刷するコマンドは、最初のスクリプトの引数に依存しません(この場合、2番目のスクリプトをコピーする必要がある場合は単にコピーするだけです)。

b)その呼び出しに変数が含まれていないため、タッチしているファイルがtouch "$MY_PATH"/"$MY_FILE"他のコマンドを印刷するファイルとはまったく異なる場合があります。"$MY_PATH"おそらくこれは予想される動作ですが、少し奇妙に見えます。

答え2

echo 'ps -u $1 -o comm=CMD -o pid,ppid,user,uid,gid' >> $MY_FILE

通常、次のドキュメントを使用してスクリプトを生成する方が簡単です。

cat <<"EOT" >"$MY_FILE"
#! /bin/bash
ps -u $1 -o comm=CMD -o pid,ppid,user,uid,gid
EOT

周囲の引用符のためにEOT何も拡張されません。

関連情報