我正在为学校编写一个小脚本,目的是使用一个命令行(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
我不知道如何摆脱,你们可以帮助我解决这个问题吗?
答案 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