간단한 스크립트를 작성했는데 이를 여러 호스트에서 실행하고 싶습니다. (즉, 저는예스크립트를 작성하지만 여러 호스트에서 실행해야 합니다. ) 스크립트는 작동하지만 첫 번째 호스트에서만 작동합니다. 여러 호스트를 추가하면 오류 메시지가 나타납니다.
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
, 프로그램 실행 jkl
및 xyz
환경 변수 설정을 나타냅니다 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
.