쉘 스크립트에서 개행 문자를 효율적으로 사용

쉘 스크립트에서 개행 문자를 효율적으로 사용

문맥: 원격 컴퓨터에서 일부 스크립트를 실행한 다음 종료하는 작업이 있습니다.

스크립트가 있지만 내부에서 개행 문자를 사용하는 방법을 모르겠습니다.

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

두 번째 단계에서는 많은 속성이 있는 JMeter 스크립트를 실행합니다. 여기에 줄 바꿈을 사용하여 모든 줄이 한 단계에 있다고 생각하는 방법이 있습니까? 아래에 언급된 바와 같이

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

실행되므로 sshdBourne user-s-login-shell -c sh과 같은 쉘이 코드를 해석하고 있음을 알 수 있습니다.

JVM_ARGS="-Xms512m -Xmx25000m" ./jmeter.sh...Bourne-shell 또는 호환 구문의 예입니다. csh, tcsh, rc, 및 쉘에서 작동 하므로 eson의 로그인 쉘이 해당 쉘 중 하나이면 fish작동하지 않습니다 .ssh user@server sh << EOFuserserver

그러나 한 가지 중요한 차이점은 이 경우 user-s-login-shell로그인 쉘로 시작되지 않으므로 로그인 세션을 설정하거나 읽 /etc/profile거나 (또는 이에 상응하는 사용자의 로그인 쉘) 설정하지 않는다는 것입니다.~/.profile

또는 이 코드를 모든 쉘과 호환되는 구문으로 변환할 수 있습니다. ( env JVM_ARGS='-Xms512m -Xmx25000m' ./jmeter.sh...큰 따옴표 대신 작은 따옴표를 사용하고 env대신 env 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

또는 , , 및 배열과 같은 rcksh93을 사용 하십시오 zsh.bashyash

사용법 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

관련 정보