최근에 쉘을 사용하여 f 서버 프로그램을 백업하고 교체하는 스크립트를 작성했습니다. 원래 의도는 인력과 반복적인 기계 노동을 절약하는 것이었습니다. 대본 작성 과정에서 부주의로 인해 여분의 공백을 입력하게 되면서 예상치 못한 상황이 발생했습니다.
1. 먼저 문제가 있는 replacement.sh를 살펴보겠습니다. space, 그런 다음 bash replacement.sh가 스크립트를 실행할 때 예기치 않은 상황이 발생합니다: ssh 172.16.72.50 mv /data/kuyin_new/musicsearch/bin/logs/mv.sh /data/kuyin_new/musicsearch/bin/logs/mv. sh.bak (
ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak
변수
원래 의도는 echo를 사용하여 명령 조합이 올바른지 확인하는 것이지만 이 명령은 실행되지 않습니다. 그렇다면 왜 이런 일이 발생합니까?
문제를 찾으려면 bash -x replacement.sh를 통해 스크립트를 실행하면 됩니다. "-x" 옵션을 사용하면 스크립트 실행 중에 쉘이 실제로 실행하는 각 명령줄을 표시하고 줄 시작 부분에 "+" 기호를 표시합니다. "+" 기호 뒤에 표시되는 것은 변수 대체 후 명령줄의 내용으로, 실제로 어떤 명령이 실행되는지 분석하는 데 도움이 됩니다. "-x" 옵션은 사용이 간단하고 편리하며 대부분의 쉘 디버깅 작업을 쉽게 처리할 수 있습니다. 디버깅을 위한 첫 번째 선택으로 간주되어야 합니다. bash -x replacement.sh
를 실행하면 결과는 다음과 같습니다. replacement.sh의 10행이 2개의 명령으로 분할되는 것을 볼 수 있습니다(노란색 상자와 빨간색 상자 합계) 2개의 명령), 따라서 ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak이 실행됩니다. 다음으로, 10행에서 추가 공백을 제거하고 효과를 확인합니다. 2. 일반 교체.sh 목록 2: 교체.sh
1 #!/bin/sh 2 file="mv.sh" #日志清理脚本 3 bak="mv" 4 replace="scp" 5 hostPath="/data/kuyin_new/musicsearch/bin/logs" 6 #hostList=(172.16.72.50 172.16.72.56 172.16.72.58 172.16.72.76 172.16.72.78 172.16.72.96 172.16.72.98) 7 hostList=(172.16.72.50) 8 for host in ${hostList[*]} 9 do10 bakCmd= "ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak" #先备份目标机器上的脚本,这里=之后多打了一个空格11 echo $bakCmd #这里先打印一下bakCmd命令,看一下12 #bash -c "$bakCmd"13 #replaceCmd="$replace $file ${host}:${hostPath}" #拷贝至目标机器14 #finalCmd="${bakCmd} ; ${replaceCmd}"15 #echo $replaceCmd16 #echo $finalCmd17 #bash -c "$finalCmd"18 done실행 결과는 다음과 같습니다.
따라서 쉘 스크립트 작성 시 공백에 특히 주의하십시오.
위 내용은 공백으로 인한 쉘 예외의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!