シェルスクリプトで関数呼び出しを使用してコマンドを実行しようとしています。その関数の引数としてその関数にコマンドを渡すと、機能しません。
関数の定義:
function ExecuteCommand() (
# $1: User@Host
# $2: Password
# $3: Command to execute
# Collect current IFS value
OLD_IFS=$IFS
# Set IFS value to new line feed
IFS=$'\n'
#Execute the command and capture the output
EXPECT_OUTPUT=($(expect ssh_exec.expect $1 $2 $3))
#Print the output
OUTPUT_LINE_COUNT=${#EXPECT_OUTPUT[@]}
for ((OUTPUT_LINE_INDEX=0; OUTPUT_LINE_INDEX<OUTPUT_LINE_COUNT; OUTPUT_LINE_INDEX++)) ;
do
echo ${EXPECT_OUTPUT[$OUTPUT_LINE_INDEX]}
done
# Get back to the original IFS
IFS=$OLD_IFS
)。
関数呼び出し:
ExecuteCommand oracle@192.168.***.*** password123 "srvctl status database -d mydb"
そして、私が得る出力は次のとおりです。
spawn ssh oracle@192.168.***.*** {srvctl status database -d mydb}
oracle@192.168.***.***'s password:
bash: {srvctl: command not found
しかし、関数の引数としてコマンドを渡さない場合、それは完全に機能します。
その場合の関数定義:
function ExecuteCommand() (
# $1: User@Host
# $2: Password
# Collect current IFS value
OLD_IFS=$IFS
# Set IFS value to new line feed
IFS=$'\n'
#Execute the command and capture the output
EXPECT_OUTPUT=($(expect ssh_exec.expect $1 $2 srvctl status database -d mydb))
#Print the output
OUTPUT_LINE_COUNT=${#EXPECT_OUTPUT[@]}
for ((OUTPUT_LINE_INDEX=0; OUTPUT_LINE_INDEX<OUTPUT_LINE_COUNT; OUTPUT_LINE_INDEX++)) ;
do
echo ${EXPECT_OUTPUT[$OUTPUT_LINE_INDEX]}
done
# Get back to the original IFS
IFS=$OLD_IFS
)。
関数呼び出し:
ExecuteCommand oracle@192.168.***.*** password123
そして、期待どおりの出力が得られます。
spawn ssh oracle@192.168.***.*** srvctl status database -d mydb
oracle@192.168.***.***'s password:
Instance mydb1 is running on node mydb1
Instance mydb2 is running on node mydb2
Instance mydb3 is running on node mydb3
最初のケースでコマンドを関数パラメーターとして渡すときに何が悪かったのか教えてください。