如何写这个bash循环

问题:指定目录下有若干图片,需要两两拼接,目前采用的笨办法:

#! /bin/bash

convert 01.png 02.png +append a1.png
convert 03.png 04.png +append a2.png
convert 05.png 06.png +append a3.png
convert 07.png 08.png +append a4.png
convert 09.png 10.png +append a5.png
convert 11.png 12.png +append a6.png
convert 13.png 14.png +append a7.png
convert 15.png 16.png +append a8.png
convert 17.png 18.png +append a9.png
convert 19.png 20.png +append a10.png
convert 21.png 22.png +append a11.png
convert 23.png 24.png +append a12.png

请问如果要用循环处理该怎么写

为了简化,文件名是重新命名过的,原先的单数字文件名是没有前导0的, 进阶想实现的是,获取指定目录下的所有png(1.png 2.png …nn.png),1+2–a1 3+4–a2 nn-1+nn–amm…

自己写了个循环一是不会双循环控制,二是分了几种IF太丑就不放了 谢谢

shell的循环不好写的话,可以考虑用python之类的写个shell脚本。

  1. for
for ((i = 1; i < n; i+=2)); do
convert "$i.png" "$((i+1)).png" +append "a$i.png"
done
  1. xargs
 seq 1 2 50 | xargs -n1 -I % sh -c 'convert "%.png" "$((%+1)).png" +append "a%.png"'
2 个赞

太强了,感谢!自己想破头 :upside_down_face:

图灵社区的新书《 Linux命令行与shell脚本编程大全(第4版)》了解一下,里面有一些常用的实践。 :joy:

echo `python <<EOF
[print(f'convert {i*2-1}.png {i*2}.png +append a{i}.png', end=';') for i in range(1, 13)]
EOF` | bash

感觉用python也挺方便的

1 个赞

谢谢推荐,学习

m1\n10 |convert %02d(- (* 2 x) 1).png %02d(* 2 x).png +append a%1d.png

;; (tiny-expand) →
;;  convert 01.png 02.png +append a1.png
;;  convert 03.png 04.png +append a2.png
;;  convert 05.png 06.png +append a3.png
;;  convert 07.png 08.png +append a4.png
;;  convert 09.png 10.png +append a5.png
;;  convert 11.png 12.png +append a6.png
;;  convert 13.png 14.png +append a7.png
;;  convert 15.png 16.png +append a8.png
;;  convert 17.png 18.png +append a9.png
;;  convert 19.png 20.png +append a10.png

谢谢(不明觉历)

再好奇一下,如果文件名本身有前导0如01.png…99.png这样的 需要怎么调整命令 查到一个seq -w 但还是不太会用

另外,合并后的序号也是按2递增的,如何按1呢

有个 printf 命令,用法与 C 库一致,比如:

printf a%02d.png $i

这个解决方案是错的,第三列文件序号不连续。

range 1 24 &step=2 | each {|x| printf "convert %.2d.png %.2d.png +append a%d.png\n" $x (+ $x 1) (
/ (+ $x 1) 2)}

受够了 bash 不如来用用 elvish

你说的对,但是我不准备改。

它的教程挺多但似乎示例少,是给已经掌握了bash的人用的,查了半天,你这个输出是对的,但如何能让它执行呢谢谢

#!/usr/bin/env elvish
range 1 $args[0] &step=2 | each {|x| printf "convert %.2d.png %.2d.png +append a%d.png\n" $x (+ $x 1) (
/ (+ $x 1) 2)}

line 2: range 1 $args[0] &step=2 | each {|x| printf “convert %.2d.png %.2d.png +append a%d.png\n” $x (+ $x 1) ((+ $x 1) 2)}

试了下不工作哎,报out of range: index has no valid value, but is 0

你要把 24 作为脚本的参数传进去

这个脚本的核心其实是搞清楚三列数值的关系。

A = C * 2 - 1
B = C * 2
C = 循环变量
1 个赞