Bash坏替换

时间:2016-11-20 21:33:35

标签: bash substitution string-substitution

我正在为学校编写一个小脚本,目的是使用一个命令行(no;或&&)

获取bmp文件的大小(文件作为参数)

所以我这样做了:

#!/bin/bash

echo "size : ${$(xxd -p -seek 02 -l 4 $1):6:2}${$(xxd -p -seek 02 -l 4 $1):4:2}${$(xxd -p -seek     02 -l 4 $1):2:2}${$(xxd -p -seek 02 -l 4 $1):0:2} bytes"

但是当执行时(使用bash或执行),它会返回以下错误:

./script.sh: line 3: size : ${$(xxd -p -seek 02 -l 4 $1):6:2}${$(xxd -p -seek 02 -l 4 $1):4:2}${$(xxd -p -seek 02 -l 4 $1):2:2}${$(xxd -p -seek 02 -l 4 $1):0:2} bytes: bad substitution

我不知道如何摆脱,你们可以帮助我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

子串扩展是参数扩展的一部分,即您只能在参数或变量上使用它。这意味着可以尝试

${varname:6:2}

但是你不能在命令替换的输出上使用它,除非你先将它保存到变量:

output=$(xxd -p -seek 02 -l 4 "$1")
echo "${output:6:2}"

答案 1 :(得分:0)

一些不同的方式:

echo "size: $(dd if=$1 bs=2 skip=1 count=2 2>/dev/null| od -t u4 -A n) bytes."

dd if=$1 bs=2 skip=1 count=2 2>/dev/null| od -t u4 -A n

tail -c +3 $1 | head -c 4 | od -t u4 -A n

Nota:您可以指定:

tail -c +3 $1 | head -c 4 | od --endian=little -t u4 -A n

您可以通过强制数字来填充空格:

echo "size: $(($(tail -c +3 $1 | head -c 4 | od --endian=little -t u4 -A n))) bytes."

甚至

perl -e 'seek STDIN,2,0;sysread(STDIN,$b,4);printf "Size: %d bytes\n", unpack("V",$b);' <$1