bash脚本循环以检查变量是否包含字符串-不起作用

时间:2019-04-26 13:26:30

标签: bash loops

我有一个脚本,可以将文件从一个s3存储桶复制到本地服务器,执行一些操作,然后将其上传到另一个s3存储桶。 在原始存储桶中,我只有几个文件夹,其中一个名为“其他” 我希望我的脚本在此文件夹上工作 我试图定义一个循环来检查路径字符串是否不包含字符串“ OTHER”,然后才继续执行其他命令,但由于某种原因它不起作用。 我在做什么错了?

#!/bin/bash
shopt -s extglob

       gcs3='s3://gc-reporting-pud-production/splunk_printer_log_files/'
       gcs3ls=$((aws s3 ls 's3://gc-reporting-pud-production/splunk_printer_log_files/' --recursive) | sed 's/^.*\(splunk_printer.*\)/\1/g'| tr -s ' ' | tr ' ' '_')
       ssyss3=s3://ssyssplunk
       tokenFile=/splunkData/GCLogs/tokenFile.txt
       nextToken=$((aws s3api list-objects-v2 --bucket "gc-reporting-pud-production" --prefix splunk_printer_log_files/ --max-items 5) |grep -o 'NEXTTOKEN.*' |awk -F " " '{print $2}')
        newToken=$( tail -n 1 /splunkData/GCLogs/tokenFile.txt )
        waterMark=$(aws s3api list-objects-v2 --bucket "gc-reporting-pud-production" --prefix splunk_printer_log_files/ --max-items 5  --starting-token 
       $newToken|sed 's/^.*\(splunk_printer.*zip\).*$/\1/'|sed '1d'|sed '$d')
 while true; do
        for j in $waterMark ; do
                echo $j
                if [ "$j" != *"OTHER"* ]; then
                        gcRegion=$(echo $j |  awk  -F'/' '{print $2}')
                        echo "gcRegion:"$gcRegion
                        if [ "$gcRegion" != "OTHER" ]; then
                                gcTech=$(echo $j | awk  -F'/' '{print $3}')
                                echo "GCTech:"$gcTech
                                gcPrinterFamily=$(echo $j | awk  -F'/' '{print $4}')
                                echo "gcPrinterFamily:" $gcPrinterFamily
                                gcPrinterType=$(echo $j | awk  -F'/' '{print $5}')
                                echo "gcPrinterType:" $gcPrinterType
                                gcPrinterName=$(echo $j| awk -F'/' '{print $6}')
                                echo "gcPrinterName:" $gcPrinterName
                                gcFileName=$(echo $j| awk -F'/' '{print $7}'| awk -F'.zip' '{print $1}')
                                echo "gcFileName:" $gcFileName
                                cd /splunkData/GCLogs

 dir="/splunkData/GCLogs/$gcRegion/$gcTech/$gcPrinterFamily/$gcPrinterType/$gcPrinterName"
                                echo "dir:"$dir
                                mkdir -p  $dir
                                aws s3 sync $gcs3$gcRegion/$gcTech/$gcPrinterFamily/$gcPrinterType/$gcPrinterName/  $dir
                                find $dir  -name '*.zip' -exec sh -c 'unzip -o -d "${0%.*}" "$0"' '{}' ';'
                                aws s3 cp $dir $ssyss3/$gcRegion/$gcTech/$gcPrinterFamily/$gcPrinterType/$gcPrinterName/ --recursive --exclude "*.zip"


                                newToken=$( tail -n 1 /splunkData/GCLogs/tokenFile.txt )
                                nextToken=$(aws s3api list-objects-v2 --bucket "gc-reporting-pud-production" --prefix splunk_printer_log_files/ --max-items 5 --starting-token $newToken |grep -o 'NEXTTOKEN.*' |awk -F " " '{print $2}')
                                 waterMark=$(aws s3api list-objects-v2 --bucket "gc-reporting-pud-production" --prefix splunk_printer_log_files/ --max-items 5  --starting-token $newToken|sed 's/^.*\(splunk_printer.*zip\).*$/\1/'|sed '1d'|sed '$d')
                                echo "$nextToken" > "$tokenFile"
                        fi
                fi
        done


done

2 个答案:

答案 0 :(得分:1)

您需要使用双括号条件命令将==!=转换为模式匹配运算符:

if [[ "$j" != *"OTHER"* ]]; then
#  ^^                   ^^

或使用case

case "$j" in
*OTHER*) ... ;;
*) echo "this is like an `else` block" ;;
esac

将您的代码粘贴到https://www.shellcheck.net/中,以解决其他问题。

答案 1 :(得分:0)

我认为格伦·杰克曼走在正确的道路上。试试这个:

if [[ "$j" != *OTHER* ]]; then

模式字符串匹配需要[[]](并且必须删除“”。case语句也是一个好主意。您可以完全放弃shell测试,并按以下方式使用grep:

if 
  grep -q '.*OTHER.*' <<< "$j" 2>/dev/null
then
  ...
fi

这里是[[]]的校验:

$ echo $j
abOTHERc

$ [[ "$j" == *OTHER* ]]

$ echo $?
0

根据BenjaminW。,[[]]中$ j周围的引号是不必要的。但是,*OTHER*周围的引号确实有很大的不同。见下文:

$ j="OTHER THINGS"
$ [[ $j == "*OTHER*" ]] ; echo "$j" matches '"*OTHER*"': $?
OTHER THINGS matches "*OTHER*": 1

$ [[ $j == *OTHER* ]] ; echo "$j" matches '*OTHER*': $?
OTHER THINGS matches *OTHER*: 0