如果你的shell是足够新的版本bash
,即parameter expansion符号应该工作。
在其他许多炮弹,它不会工作,并且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
和dirname
的调用中。
你想做什么? –
您对剧本的理由是什么,即$ 1的价值?请将上述信息编辑成上述信息,而不是回复我的评论。尝试在dbl引号中包含所有对$ 1的引用,即'echo“$ 1”'等等,祝你好运! – shellter
你用'$ {a:0}'发现了什么? –