无法找出 shell 脚本意外操作符中的错误

Ash*_*rpe 5 shell-script

$ sh 备份到 s3.sh

backup-to-s3.sh: 11: [: bkup_20151106_150532.zip: unexpected operator
backup-to-s3.sh: 11: [: bkup_20151106_150532.zip: unexpected operator
backup-to-s3.sh: 11: [: bkup_20151106_150532.zip: unexpected operator
backup-to-s3.sh: 11: [: bkup_20151106_150532.zip: unexpected operator
backup-to-s3.sh: 11: [: bkup_20151106_150532.zip: unexpected operator
backup-to-s3.sh: 11: [: bkup_20151106_150532.zip: unexpected operator
Run Code Online (Sandbox Code Playgroud)

ubuntu@accretive-staging-32gb-ephemeral:~$ cat backup-to-s3.sh

#Script to move /home/ubuntu/backup folder  to S3://auto-backup
#Author Ashish Karpe
cd /mnt/backup
filename="bkup_$(date +%Y%m%d_)"
/bin/ls -alF | awk '{ print $9 }'  > /tmp/file

for i in $(cat /tmp/file); do
#       echo $i;
#       read a;
#       echo $filename;
        if [ $filename* = $i ]
        then
                echo "Copying " $i "to S3://auto-backup";
                s3cmd put $i s3://auto-backup

            fi

done
Run Code Online (Sandbox Code Playgroud)

gle*_*man 6

  1. 不要for用于遍历文件的行,请使用

    while IFS= read -r line; do ...; done < filename
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您根本不需要将ls输出通过管道传输到文件,尤其是使用-F

  3. 使用 bash[[ x == y ]]进行模式比较,模式在右侧:
#!/bin/bash
cd /mnt/backup
prefix="bkup_$(date +%Y%m%d_)"

for file in * .*; do
    [[ -f $file ]] || continue    # skip things like directories and soft links
    if [[ $file == $prefix* ]]; then
        echo "Copying " $file "to S3://auto-backup";
        s3cmd put $file s3://auto-backup
    fi
done < /tmp/file
Run Code Online (Sandbox Code Playgroud)

  • 它 [在 bash 手册中记录](http://www.gnu.org/software/bash/manual/bashref.html#index-_005b_005b):`当使用 '==' 和 '!=' 运算符时,运算符右侧的字符串被认为是一个模式,并根据下面模式匹配中描述的规则进行匹配 (3认同)