2つのシェルスクリプトがあります。
そのうちの1つがソースファイルです。ソースコード.sh。このソースファイルは、複数の人がそれぞれ独自のディレクトリを持って使用することになります。
name = "foo"
メインスクリプトメインディレクトリほとんどのコードを実行します。変数を渡す必要がありますname
。
name = "foo"
sed -i "3i\\$name" /main.sh
/scripts/main.sh
sed -i '3d' /main.sh
このコード部分は事前に作成されました。
sedを削除して次のように書くのが良いでしょうか?
/scripts/main.sh "name"
?
これはBashの最初のプロジェクトなので、専門知識が限られています。
答え1
スクリプトの変更の代わりにパラメーターを使用するようにスクリプトを再作成できる場合は、そうします。
スクリプトを変更したい場合は、いくつかの法的またはコンプライアンスの状況があります。
- スクリプトにコマンドラインに渡すには、パラメータが多すぎる可能性があります。この場合、次の作業を行う方が簡単です。
sed -i "s/@PARAM1@/a/" main.sh
sed -i "s/@PARAM2@/b/" main.sh
...
sed -i "s/@PARAM99999@/zzzzzzzz/" main.sh
ただし、この場合は、これらのパラメーターを構成ファイルに入れてスクリプトから読み取ることをお勧めします。
- スクリプトは、より大きなスクリプトセットの一部であり得る。
sed
同じハードコーディングされた値を共有する必要がある複数のスクリプトのループで呼び出すことができます。このアプローチは通常、さまざまなオートメーションジェネレータおよび/またはビルドシステムで使用されます。
ただし、この場合、関連スクリプトは通常二重方式で実行されます。つまり、通常の方法でパラメータを読み込みますが、sed
デフォルト値を設定します。それは次のとおりです。
#!/bin/bash
usage() {
echo "-a=N do something (default value @A@)"
echo "-b=ABC do something else (default value @B@)"
}
A=@A@
B=@B@
while getopts "a:b:" par; do
case $par in
a) A=$OPTARG
;;
b) B=$OPTARG
;;
*) usage
;;
esac
done
echo $A
echo $B
複雑なアプリケーションに複数のスクリプトがある場合は、ループを介してすべてのスクリプトを渡すのが非常に便利ですsed -i "s/@A@/somevalue" $script
。最初にデフォルト値を設定した後、パラメータを使用します。
- 問題のスクリプトはシェルスクリプトではない可能性があり、パラメータをまったく読み取れません。これは通常、スクリプト自体がいくつかのツール(または
sqlplus
)に入力されたときに発生します。これは「スクリプトが変更されている」expect
唯一の合法的な状況です。sed
答え2
明示的なパラメータが必要ない場合は、環境変数を参照できます。利用可能なものがあれば、出力に表示されますenv
。それ以外の場合は、ユーザーに新しい設定を設定するように依頼できます。
デフォルトのスクリプトでは、ファイルをディレクトリに保存するために人の名前が必要です。
$HOME
次のいずれかの変数のようです$XDG_*
。
https://specations.freedesktop.org/basedir-spec/basedir-spec-latest.html