如果您的 shell 是最新版本的bash
,则该参数扩展表示法应该可以工作。
在许多其他 shell 中,它不起作用,并且bad substitution
错误是 shell 说“您要求进行参数替换,但它对我没有意义”的方式。
另外,给定脚本:
#! /bin/sh
length=echo `expr index "$1" .zip`
a=$1
echo $(a:0:length}
第二行导出带有运行生成的命令的length
值的变量。它不分配给。那应该只是:echo
expr index "$1" .zip
length
length=$(expr index "${1:?}" .zip)
如果未设置,则${1:?}
表示法会生成错误(如果在没有参数的情况下调用脚本)。$1
最后一行应该是:
echo ${a:0:$length}
请注意,如果$1
保持filename.zip
,则 的输出expr index $1 .zip
为 2,因为该字母i
出现在 中的索引 2 处filename.zip
。如果打算获取没有.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)`.)
如果文件名可以包含空格,则需要考虑使用双引号,尤其是在调用basename
and时dirname
。