シェルスクリプトで改行文字を効率的に使用する

シェルスクリプトで改行文字を効率的に使用する

コンテキスト: リモートコンピュータでいくつかのスクリプトを実行して終了することがあります。

スクリプトがありますが、内部で改行文字を使用する方法がわかりません。

triggerPerformanceTest(){
report=$1
userDataFiles=$2
baseURL=$3
cdnURL=$4
streamingURL=$5
echo "Startin the Jmeter script"
ssh -tt -i Test.ppk username@<test server> <<EOF
cd apache-jmeter-3.1/bin/
JVM_ARGS="-Xms512m -Xmx25000m" ./jmeter.sh -n -t /home/ubuntu/JMeter/Test.jmx --jmeterproperty XMLReport=$report --jmeterproperty UserDataFile=$userDataFiles --jmeterproperty BaseUrl=$baseURL --jmeterproperty CdnUrl=$cdnURL --jmeterproperty StreamingUrl=$streamingURL --jmeterproperty isBenchMark=false --jmeterproperty Enable_DigitalExhaust=true --jmeterproperty Enable_Health=true --jmeterproperty HealthPollingInterval=6
exit
EOF
echo "Test successfully executed"
}

triggerPerformanceTest Log.csv UserDataFile.csv localhost localhost localhost

2番目のステップでは、多くのプロパティを持つJMeterスクリプトを実行します。ここでは、改行を使用してすべての行が1つのステップにあると思う方法はありますか?下記のように

ssh user@server << EOF
  command_one
  command_two argument1 argument2 argument3 argument4
              argument5 argument6 argument7
  command_three
EOF

答え1

<<hereドキュメントでは、(here)の後の区切り文字は引用符でEOFはなく、<backslash><newline>シーケンスが削除されます。行連続

実際に<backslash><newline>削除されなかった唯一のケースは次のとおりです。

  • 一重引用符の中
  • ここで区切り文字を参照する文書から
  • バックスラッシュ自体が引用されている場所(<backslash><backslash><newline>

cat << EOF
foo\
bar
EOF

出力

foobar

ここでは、次のことができます。

ssh user@server << EOF
  command_one
  command_two argument1 argument2 argument3 argument4 \
              argument5 argument6 argument7
  command_three
EOF

結局ssh、餌を食べるでしょう:

  command_one
  command_two argument1 argument2 argument3 argument4               argument5 argument6 argument7
  command_three

標準入力にあります。

以下を使用しても、ssh ... << 'EOF'この文書内でパラメータ拡張、コマンド置換、および算術拡張を避けるために、次のようにssh入力されます。

  command_one
  command_two argument1 argument2 argument3 argument4 \
              argument5 argument6 argument7
  command_three

ただし、リモートシェルはそれを<backslash><newline>連続して解釈するため、同じ効果があります。

これを行うときは、次の点に注意してください。

ssh user@server << EOF

sshdコードを解釈するには、リモートホストでユーザーのログインシェルを実行します。 Bourneのようなシェルである必要はありませんが、何でも可能なので、次のことを実行するのが最善です。

ssh user@server sh << EOF

実行されるので、sshdBourneuser-s-login-shell -c shのようなシェルがコードを解釈していることがわかります。

JVM_ARGS="-Xms512m -Xmx25000m" ./jmeter.sh...Bourne-shell または互換構文の例です。csh、、、、およびシェルで機能するため、onのログインシェルがそのシェルの1つである場合はtcsh機能しません。rcesfishssh user@server sh << EOFuserserver

ただし、1つの重要な違いは、この場合はuser-s-login-shellログインシェルから始まらないため、ログインセッションを設定、読み取り、または/etc/profile(または対応するユーザーのログインシェル)設定しないことです。~/.profile

あるいは、このコードをすべてのシェルと互換性のある構文に変換することもできます。 (env JVM_ARGS='-Xms512m -Xmx25000m' ./jmeter.sh...二重引用符ではなく一重引用符を使用し、代わりにenvenv varsを渡すためにBourne / rc固有の構文を使用してくださいenvvar=value cmd。)

以下を使用すると、バックスラッシュを回避できますxargs

ssh user@server sh << EOF
  command_one
  xargs command_two << END_OF_ARGS
    argument1 argument2 argument3 argument4
    argument5 argument6 argument7
  END_OF_ARGS
  command_three
EOF

または、、、配列などのrcシェルksh93を使用してくださいzshbashyash

使用法rc/zsh構文:

ssh user@server zsh << 'EOF'
  command_one
  args=(
    argument1 argument2 argument3 argument4
    argument5 argument6 argument7
  )
  command_two $args
  command_three
EOF

(ローカルシェルが拡張されないようにここに引用しましたEOF$args

またはksh93//bash構文を使用してくださいyash(また動作しますzsh):

ssh user@server bash << 'EOF'
  command_one
  args=(
    argument1 argument2 argument3 argument4
    argument5 argument6 argument7
  )
  command_two "${args[@]}"
  command_three
EOF

答え2

\はい、次の行を続行するには行を終了してください。

ssh user@server << EOF
  command_one
  command_two argument1 argument2 argument3 argument4\
              argument5 argument6 argument7
  command_three
EOF

関連情報