String concatenation in Bash script

2019-03-03 00:05发布

I am writing this Bash script:

count=0   
result

for d in `ls -1 $IMAGE_DIR | egrep "jpg$"`
do

    if (( (count % 4) == 0 )); then
                result="abc $d"

                if (( count > 0 )); then
                    echo "$result;"
                fi

        else
            result="$result $d"
        fi

        (( count++ ))

done

if (( (count % 4) == 0 )); then
    echo $result
fi

The script is to concate part strings into a string when the value is divided by 4 and it should be larger than 0.

In the IMAGE_DIR, I have 8 images,

I got outputs like this:

abc et004.jpg
abc et008.jpg

But I would expect to have:

abc et001.jpg et002.jpg et003.jpg et004.jpg;
abc et005.jpg et006.jpg et007.jpg et008.jpg;

How can I fix this?

标签: bash shell
3条回答
对你真心纯属浪费
2楼-- · 2019-03-03 00:48

Something like this (untested, of course):

count=0 result=

for d in "$IMAGE_DIR"/*jpg; do
   (( ++count % 4 == 0 )) &&
     result="abc $d"
   (( count > 0 )) &&
     printf '%s\n' "$result" ||
      result+=$d
done
查看更多
聊天终结者
3楼-- · 2019-03-03 00:50

Something like this?

count=0   

find $IMAGE_DIR -name "*.jpg" |
while read f; do
        if (( (count % 4) == 0 )); then
                result="abc $f"

                if (( count > 0 )); then
                        echo $result
                fi

        else
                result="$result $d"
        fi

        (( count++ ))
done
查看更多
家丑人穷心不美
4楼-- · 2019-03-03 01:04

The = operator must always be written without spaces around it:

result="$result $d"

(Pretty much the most important difference in shell programming to normal programming is that whitespace matters in places where you wouldn't expect it. This is one of them.)

查看更多
登录 后发表回答