1

シェルスクリプトで関数呼び出しを使用してコマンドを実行しようとしています。その関数の引数としてその関数にコマンドを渡すと、機能しません。

関数の定義:

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

最初のケースでコマンドを関数パラメーターとして渡すときに何が悪かったのか教えてください。

4

1 に答える 1

0

私が間違っていなければ、二重引用符で囲まれた「期待する」という引数は中括弧に置き換えられます。したがって、expectコマンドは次のようになります。

expect ssh_exec.expect oracle@192.168.***.*** {srvctl status database -d mydb}

これにより、シェルは「{srvctl」をコマンドとして解釈するようになりました。

次のように使用してみてください。

EXPECT_OUTPUT=($(expect ssh_exec.expect $*))

それ以外の

EXPECT_OUTPUT=($(expect ssh_exec.expect $1 $2 $3))

そして、次のように関数を呼び出します。

ExecuteCommand oracle@192.168.***.*** password123 srvctl status database -d mydb
于 2012-09-20T06:48:25.813 に答える