【问题标题】:String concatenation in Bash scriptBash 脚本中的字符串连接
【发布时间】:2011-10-27 15:12:44
【问题描述】:

我正在编写这个 Bash 脚本:

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

脚本是将部分字符串拼接成一个字符串,当值除以4时,它应该大于0。

在 IMAGE_DIR 中,我有 8 张图片,

我得到这样的输出:

abc et004.jpg
abc et008.jpg

但我希望有:

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

我该如何解决这个问题?

【问题讨论】:

  • 也许Code Review 会是一个更好的地方来提出这样的问题?
  • 附带说明,您应该避免使用反引号,因为它们不会嵌套。只需使用 $(...) 代替。如果你有带空格的 jpg 文件(比如ls | grep | while read d; do ...),你的 for 循环也会失败。

标签: bash shell


【解决方案1】:

= 运算符必须始终写成周围没有空格:

result="$result $d"

(shell 编程与普通编程最重要的区别在于,空格在你意想不到的地方很重要。这就是其中之一。)

【讨论】:

    【解决方案2】:

    这样的?

    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
    

    【讨论】:

    • 谢谢,这很有希望。我想我应该在循环之外声明结果,对吗?我已经更新了我的代码,但我想我错过了一些连接字符串的东西......我仍然发现错误。你知道吗?
    • 没关系,我的解决方案现在有效,我应该把 echo 放在前面。非常感谢!
    【解决方案3】:

    类似这样的东西(当然未经测试):

    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
    

    【讨论】:

      猜你喜欢
      • 2012-12-19
      • 2021-12-31
      • 1970-01-01
      • 2018-12-07
      • 2015-12-18
      • 1970-01-01
      • 2016-05-07
      • 2015-12-30
      • 1970-01-01
      相关资源
      最近更新 更多