反转参数列表并丢失双引号

时间:2018-08-03 06:24:00

标签: bash arguments imagemagick-convert quoting

重新访问一个简单的脚本以将图像附加在一起,因为路径中的空格是有问题的。

输出正确,但是路径/文件名没有双引号,因此转换失败。

我很确定这是一个简单的语法修复。有什么建议吗? ...也许我最好在文件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

2 个答案:

答案 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"