ファイルが存在することを確認する構文エラー[閉じる]

ファイルが存在することを確認する構文エラー[閉じる]

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。つまり、存在するかどうかにかかわらず削除してみてください。

関連情報