Bash - 自解压脚本错误

Posted

技术标签:

【中文标题】Bash - 自解压脚本错误【英文标题】:Bash - Self extracting script error 【发布时间】:2014-06-12 10:49:48 【问题描述】:

我正致力于在 Open SuSE 上创建自解压 shell 脚本。我引用this link。我的代码如下所示-

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

【讨论】:

以上是关于Bash - 自解压脚本错误的主要内容,如果未能解决你的问题,请参考以下文章

shell制作自解压文件tar

shell制作自解压文件tar

shell制作自解压文件tar

bash - 错误或超时关闭脚本[重复]

3文件测试和bash中的变量类型+shift用法

我在将我的 bash 命令转换为 shell 脚本中的 shell 脚本语法错误时遇到错误