2016-11-20 7 views
1

Я работаю на крошечном сценарий для школы, который имеет для цели, чтобы получить размер (файл в качестве параметра) БМП-файл с помощью одной командной строки (нет, или & &)Bash плохая замена

Так что я сделал это:

#!/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" 

Но при выполнении (с использованием Баш или выполнения) он возвращает следующую ошибку:

./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

Итак, нет способа сделать маленький endian для большого endian в одной строке без использования переменных? –

+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 

Nota: вы можете указать:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^