Bash - Самораспаковывающийся скрипт
Я работаю над созданием самораспаковывающегося сценария оболочки на Open SuSE. Я ссылаюсь на эту ссылку. Мой код показан ниже -
#!/bin/bash
function die ()
{ echo "Error!";
exit 1 ;
}
echo Extracting...
# Script will need to find where is the archive. So search for "ARCHIVE" in this script and
# save the line number
archive=$(grep --text --line-number 'ARCHIVE:$' $0)
echo $archive
tail -n +$((archive + 1)) $0 | gzip -vdc - | tar -xvf - > /dev/null || die
echo Extraction completed
exit 0
ARCHIVE:
После того, как я выполнил вышеуказанный скрипт, я получил результат ниже. Что я считаю неправильным и вызывает ошибку.
Extracting...
22:ARCHIVE:
./symhelp_self_extract.sh: line 16: 22:ARCHIVE:: syntax error in expression (error token is ":ARCHIVE:")
gzip: stdin: unexpected end of file
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors
Error!
Может кто-нибудь объяснить, что это за синтаксическая ошибка?
Спасибо,
Omky
1 ответ
Решение
Если вам нужен номер строки:
archive=$(grep --text --line-number 'ARCHIVE:$' "$0")
archive=${archive%%:*}
Или же
archive=$(awk '/ARCHIVE:$/{print NR; exit}' "$0")
Причиной вашей проблемы было то, что вы пытались сделать арифметику с чем-то, что не является числом:
$((archive + 1)) ## here $archive = 22:ARCHIVE: before
Всегда указывайте также свои переменные:
archive=$(grep --text --line-number 'ARCHIVE:$' "$0")
...
tail -n "+$((archive + 1))" "$0"
С awk вы получите более простой подход:
awk -v r='ARCHIVE:$' '!p && $0 ~ r { p = 1; getline } p' "$0" | gzip -vdc - | tar -xvf - > /dev/null || die