파일이 존재하는지 확인하는 구문 오류 [닫기]

파일이 존재하는지 확인하는 구문 오류 [닫기]

Amazon Linux 2에서 실행되는 bash 스크립트는 파일이 존재하는지 테스트하려고 합니다. 존재하는 경우 스크립트는 파일을 삭제해야 합니다.

스크립트가 실행될 때마다 다음 오류가 발생합니다. 오류가 더 이상 문제가 되지 않도록 스크립트에서 무엇을 변경해야 합니까?

File "/home/username/write_hosts.sh", line 3
    if [ -f /home/username/hosts ]
                                 ^
SyntaxError: invalid syntax

전체 스크립트는 다음과 같습니다.

#!/usr/bin/env bash

if [ -f /home/username/hosts ]
then
    rm /home/username/hosts
fi

declare -a arr_of_tags=("this-master" "this-worker")

for i in "${arr_of_tags[@]}"
do
   echo ["$i"] >> /home/username/hosts
   echo "About to test ip array for $i"
   declare -a arr_of_ips=$(aws ec2 describe-instances --region us-west-2 --query "Reservations[*].Instances[*].PrivateIpAddress" --filter "Name=tag:Name,Values=$i" --output=text)
   for j in "${arr_of_ips[@]}"
   do 
      echo "$j" >> /home/username/hosts
   done
done


사용자 제안

@steve의 제안에 따라 다음을 얻습니다.

[username@ip-10-0-0-73 ~]$ bash --version
GNU bash, version 4.2.46(2)-release (x86_64-koji-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
You have new mail in /var/spool/mail/username

참고: 의 내용은 /var/spool/mail/username새로운 것이 아닙니다. 위의 상단에 표시된 것과 동일한 오류입니다.

@Jesse_b의 제안을 바탕으로:

[username@ip-10-0-0-73 ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/username/.local/bin:/home/username/bin

[username@ip-10-0-0-73 ~]$ sudo bash write_hosts.sh
write_hosts.sh: line 2: $'\r': command not found
write_hosts.sh: line 7: $'\r': command not found
write_hosts.sh: line 9: $'\r': command not found
write_hosts.sh: line 11: $'\r': command not found
write_hosts.sh: line 13: syntax error near unexpected token `$'do\r''
'rite_hosts.sh: line 13: `do


해결책

스크립트를 다음과 같이 변경한 후 dos2unix호출하기 전에 스크립트를 실행했습니다. 이제 결과는 작업 스크립트입니다.

#!/usr/bin/env bash

rm -f /home/username/hosts

declare -a arr_of_tags=("this-master" "this-worker")

for i in "${arr_of_tags[@]}"
do
   echo ["$i"] >> /home/username/hosts
   echo "About to test ip array for $i"
   declare -a arr_of_ips=$(aws ec2 describe-instances --region us-west-2 --query "Reservations[*].Instances[*].PrivateIpAddress" --filter "Name=tag:Name,Values=$i" --output=text)
   for j in "${arr_of_ips[@]}"
   do
      echo "$j" >> /home/username/hosts
   done
done

또한 @steve의 의심을 확인하기 위해 cronjob 정의에서 Python이 호출되는 것을 확인했으며 이를 다음과 같이 수정했습니다.

echo '* * * * * lnxcfg bash /home/username/write_hosts.sh' | sudo tee  /etc/cron.d/refresh_hosts

수정 사항은 python이전 줄에서 대신 호출되었습니다 bash. 그래서 @steve의 답변을 승인된 것으로 표시합니다.

답변1

수신되는 오류는 실제로 Python을 통해 실행하고 있음을 나타냅니다.

bash 바이너리를 Python으로 덮어쓰는 바보가 있나요? 실행해 보세요 bash --version.

[steve@centos ~]$ cat x1
#!/usr/bin/env bash

if [ -f /home/username/hosts ]
then
    rm /home/username/hosts
fi
[steve@centos ~]$ ./x1
[steve@centos ~]$ python x1
  File "x1", line 3
    if [ -f /home/username/hosts ]
                                 ^
SyntaxError: invalid syntax
[steve@centos ~]$ bash --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

[steve@centos ~]$

그런데 저는 방법 rm /home/username/hosts 2>/dev/null보다는 간단한 방법을 더 좋아합니다 if/then/rm/fi. 즉, 존재 여부에 관계없이 삭제를 시도하십시오.

관련 정보