2016-11-20 158 views
1

我工作的一个很小的脚本所学校,对目标使用一个命令行来获得一个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 

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

+1

有在试图做到这一点在一行没有可取之处。我不敢相信你会有这样糟糕的运动。也许你误解了说明。我建议仔细检查一下。 – janos

+0

这是练习。我们上周做了一个脚本(没有行限制)来获取bmp文件的大小,本周的练习是仅在一行中重新执行相同的脚本:/。 –

+0

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

回答

1

子字符串扩展是参数扩展的一部分,即您只能在参数或变量上使用它。这意味着它是确定以重

${varname:6:2} 

,但你不能使用它的命令替换的输出,除非你把它保存到一个变量第一:

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

那么没有一种方法可以在不使用变量的情况下在一行中做大端的小端? –

+0

@VoltraNeo:不使用参数扩展。但是你可以通过管道输出xxd来剪切或者awk或者其他的来转换字符串:'$(xxd ... | cut -c6-8)'等等 – choroba

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 

诺塔:您可以指定:

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

你可以通过强制数字whipe空间:

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