shell字符串替换错误



我是shell编程的新手。我打算在提取zip文件后获得目录名。它的打印声明是

$test.sh helloworld.zip
helloworld

让我们看看test.sh:

#! /bin/sh
length=echo `expr index "$1" .zip`
a=$1    
echo $(a:0:length}

然而,我从编译器中得到了Bad替换错误。

当我提到"shell"时,我只是说shell,因为我不知道bash和其他的有什么区别。我只是使用Ubuntu 10.04和终端。(我正在使用bash。)

如果您的shell是bash的最新版本,那么参数扩展表示法应该有效。

在许多其他shell中,它不起作用,bad substitution错误是shell说"您要求进行参数替换,但对我来说没有意义"的方式。


此外,给定脚本:

#! /bin/sh
length=echo `expr index "$1" .zip`
a=$1    
echo $(a:0:length}

第二行为运行expr index "$1" .zip生成的命令导出值为echo的变量length。它不分配给length。这应该只是:

length=$(expr index "${1:?}" .zip)

如果未设置CCD_ 8(如果在没有参数的情况下调用脚本),则CCD_。

最后一行应该是:

echo ${a:0:$length}

注意,如果$1保持filename.zip,则expr index $1 .zip的输出为2,因为字母i出现在filename.zip的索引2处。如果想要获得没有.zip扩展名的文件的基本名称,那么经典的方法是:

base=$(basename $1 .zip)

更现代的方式是:

base=${1%.zip}

这是有区别的;如果名称为/path/to/filename.zip,则经典输出为filename,而现代输出为/path/to/filename。您可以使用获得经典输出

base=${1%.zip}
base=${base##*/}

或者,在经典版本中,您可以使用获得路径

base=$(dirname $1)/$(basename $1 .zip)`.)

如果文件名可以包含空格,则需要考虑使用双引号,尤其是在调用basenamedirname时。

尝试使用bash运行它。

bash test.sh helloworld.zip

-同样-

"尝试将第一行更改为#!/bin/bash",如–@shellter 所回复的评论

bash:中尝试

echo $1
len=$(wc -c <<< "$1")
a="${1}.zip"
echo ${a:0:$len}

根据您的需要进行调整。

最新更新