여러 서버 관리

여러 서버 관리

간단한 스크립트를 작성했는데 이를 여러 호스트에서 실행하고 싶습니다. (즉, 저는스크립트를 작성하지만 여러 호스트에서 실행해야 합니다. ) 스크립트는 작동하지만 첫 번째 호스트에서만 작동합니다. 여러 호스트를 추가하면 오류 메시지가 나타납니다.

line 3: MACHINE2: command not found

내가 뭘 잘못했나요? 스크립트는 아래에 게시되어 있습니다.

#!/bin/sh

HOSTS=MACHINE1 MACHINE 2

for i in $HOSTS; do echo $i
    ssh -q $i uname -a;
done

답변1

이와 같은 명령

xyz=abc def ghi jkl

def매개변수 사용 ghi, 프로그램 실행 jklxyz환경 변수 설정을 나타냅니다 abc. HOSTS문자열로 설정

MACHINE1 MACHINE 2

당신은 말해야

HOSTS="MACHINE1 MACHINE 2"

MACHINE(두 번째 와 사이에 공백을 원하지 않는다고 가정하지만 2.) 호스트 이름에 공백이나 기타 특수 문자가 포함되어 있지 않으므로 작동하게 만들 수 있습니다. 그러나 배열을 사용하는 것이 더 현명할 수 있습니다.

HOSTS=(MACHINE1 MACHINE2)

for i in "${HOSTS[@]}"
do
    echo "$i"
    ssh -q "$i" uname -a
done

이 구조를 사용하면 특수 문자가 포함된 여러 단어 배열 요소를 가질 수 있습니다.

lyrics=("Twinkle twinkle little *" "How I wonder what you are")

for line in "${lyrics[@]}"
do
    printf "%s\n" "$line"
done

타당한 이유가 없는 한 항상 모든 쉘 변수 참조(예: "${HOSTS[@]}"and ) 를 인용해야 합니다."$i"틀림없이당신은 당신이 무엇을하고 있는지 알고 있습니다. 반품,

  • 줄 끝에는 세미콜론이 필요하지 않습니다. 
  • 쉘 스크립트에서는 시스템 변수가 전통적으로 대문자를 사용하기 때문에 스크립트 변수 이름에 소문자를 사용하는 것이 일반적입니다.
  • echo고정된 문자열을 인쇄하는 데는 편리하지만 임의의 데이터로 예상치 못한 작업을 수행할 수 있습니다. 그것은멀리사용하기 더 안전합니다 printf.

관련 정보