set
コマンドからbash
スクリプトに変数を渡そうとします。
$ set BeginTime=2021-10-11 2:23:00 & ./getBeginTime.sh
文書getBeginTime.sh
:
local getBeginTime=$(set | grep BeginTime)
echo "BeginTime : = $getBeginTime"
echo $getBeginTime
空の文字列が返される理由を説明してください。
答え1
コードに多くの誤解があります
文字列なしで変数を直接割り当てます
set
。割り当てられた文字列にスペースまたは他のシェル固有の文字が含まれている場合は、割り当てられた文字列を引用します(疑わしい場合は引用)。BeginTime='2021-10-11 2:23:00'
子供として働かないでください。子プロセスは親プロセスに影響を与えることはできません。割り当てを実行すると、
&
親プロセスは変更されず、すぐに終了する子プロセスに値を割り当てます。この値はまだ環境に提供されていないため(使用のため
export
)、スクリプトに渡すにはコマンドラインに含める必要があります。./getBeginTime.sh "$BeginTime"
その後、その値をスクリプトの最初のパラメータとして選択できます。
#!/bin/sh getBeginTime="$1" echo "BeginTime : = $getBeginTime"
このステートメントを書くより良い方法
echo
は、を使用することですprintf
。このecho
コマンドはシェルでは非標準であり、実装によって特定の文字シーケンスを異なる方法で処理します。一方、printf
より標準化されています。以下は、変数%s
に対応するパラメータのプレースホルダです。"$getBeginTime"
printf "BeginTime : = %s\n" "$getBeginTime"
実際に値を環境変数に渡す場合は、次のセクションで2つの方法を説明しますが、これは値を渡す一般的な方法ではありません。
# Define an environment variable just for this invocation
BeginTime='2021-10-11 2:23:00' ./getBeginTime.sh
または
# Define an environment variable for the remainder of this session
export BeginTime='2021-10-11 2:23:00'
# You can now use it as many times as you want
./getBeginTime.sh
./getBeginTime.sh
コードでは"$BeginTime"
変数として使用できます。
答え2
これを行う2つの方法は次のとおりです。
1. 環境変数を使用します。
Bash 端末で変数を設定します。
export BeginTime="2021-10-11 2:23:00"
次に、非常に単純なスクリプトでtest.sh
その変数を呼び出します。
[ws] user test_directory >cat test.sh
echo $BeginTime
2. パラメータ伝達:
test.sh
スクリプトは次のようになります。
[ws] user test_directory >cat test.sh
echo $1
パラメータを使用して呼び出します。
[ws] user test_directory > bash test.sh "2021-10-11 2:23:00"