重新访问一个简单的脚本以将图像附加在一起,因为路径中的空格是有问题的。
输出正确,但是路径/文件名没有双引号,因此转换失败。
我很确定这是一个简单的语法修复。有什么建议吗? ...也许我最好在文件args之前使用arg模式,然后通过shift来改变它?
#!/bin/bash
# BETLOG - 2015-05-05--22-17-35
#
# usage:
# betlogImageAppend.sh %F row/wor/col/loc
# #
mode=${!#} #last arg
set -- "${@:1:$(($#-1))}" #strip last arg: mode
#echo -ne "\\n\\n0 @=${@}\\n\\n"
case "$mode" in
row)
mode="+append"
in=$@
;;
wor)
mode="+append"
in="$(printf '%s\n' "$@" | tac)"
;;
col)
mode="-append"
in=$@
;;
loc)
mode="-append"
# in=$(printf '%s\n' ${@} | tac)
# in=`printf '%s\n' "${*}" | tac`
in=$(printf '%s\n' "$@" | tac)
;;
esac
echo "convert "${in}" $mode $(date +%Y-%m-%d--%H-%M-%S).jpg"
# # # convert ${in} $mode $(date +%Y-%m-%d--%H-%M-%S).jpg
我正在测试“ loc”(反向栏),因此进行了各种试验。 仅供参考:row / wor / col / loc = row / reverse row / column / reverse column
答案 0 :(得分:0)
当您这样做:
in='smth with space.jpg
another with space.jpg'
convert "${in}" ...
然后"$in"
被解释为单个一个参数。这意味着convert
将搜索一个名为smth with space.jpg\nanother with space.jpg
的文件,而不是两个文件。如果要编写convert $in ...
,则in
会被扩展并且不包含在内,空格和换行符将被解释为分隔符,因此它将获得6个文件,即。名为smth
的文件,名为with
的文件,依此类推。为了解决这个问题,我们可以使用bash数组,并且始终记住正确地转义您的参数。
mode=${!#} #last arg
set -- "${@:1:$(($#-1))}" #strip last arg: mode
case "$mode" in
row) mode="+append"; in=("$@"); ;;
# `for i;` is a shorter version of `for i in "$@";`
wor) mode="+append"; in=(); for i; do in=("$i" "${in[@]}"); done; ;;
col) mode="-append"; in=("$@"); ;;
loc) mode="-append"; in=(); for i; do in=("$i" "${in[@]}"); done; ;;
esac
printf "arg: '%s'\n" convert "${in[@]}" "$mode" "$(date +%Y-%m-%d--%H-%M-%S).jpg"
# convert "${in[@]}" "$mode" "$(date +%Y-%m-%d--%H-%M-%S).jpg"
该脚本应使用任何文件名,空格或换行符。
答案 1 :(得分:0)
非常好,谢谢。那钉住了。我知道我的阵列赋使我失败。
#!/bin/bash
# usage:
# betlogImageAppend.sh %F row/wor/col/loc
mode=${!#} #last arg
set -- "${@:1:$(($#-1))}" #strip last arg: mode
case "$mode" in
row) mode="+append"; in=("$@"); ;;
wor) mode="+append"; in=(); for i; do in=("$i" "${in[@]}"); done; ;; # `for i;` is a shorter version of `for i in "$@";`
col) mode="-append"; in=("$@"); ;;
loc) mode="-append"; in=(); for i; do in=("$i" "${in[@]}"); done; ;;
esac
convert "${in[@]}" "$mode" "$(date +%Y-%m-%d--%H-%M-%S).jpg"