2016-11-20 11 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ファイルのサイズを取得するためにスクリプト(行制限なし)を行いましたが、今週の演習では、同じスクリプトを1行だけに再作成していました。 –

+0

次のように試してください: 'dd if = $ 1 bs = 2 skip = 1 count = 2 2>/dev/null | od -t u4 -A n' –

答えて

1

サブストリングの展開はパラメータ拡張の一部です。つまり、パラメータや変数に対してのみ使用できます。

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

変数を使用せずにビッグエンディアンをリトルエンディアンで1行にする方法はありませんか? –

+0

@VoltraNeo:パラメータ拡張を使用しません。しかし、xxdの出力をカットするかawkか、文字列を変換するために '$(xxd ... | cut -c6-8)'などをパイプすることができます。 – choroba

0

いくつかの異なる方法を:それは

${varname:6:2} 

を試してOKですが、あなたは最初の変数に保存しない限り、あなたは、コマンド置換の出力にそれを使用することができないことを意味

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