2016-11-20 98 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