shell 字符串错误替换

bmp9r5qi  于 2023-10-23  发布在  Shell
关注(0)|答案(3)|浏览(113)

我是shell编程新手。我打算解压压缩文件后得到目录名。它的打印语句是

$test.sh helloworld.zip
helloworld

让我们看看test.sh:

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

但是我从编译器得到了Bad Substitution错误。
当我提到“shell”的时候,我只是在说shell,因为我不知道bash和其他shell的区别,我只是在用Ubuntu 10.04和终端。(我使用bash)

9rbhqvlz

9rbhqvlz1#

如果您的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)

其中,如果未设置$1(如果调用脚本时没有参数),则${1:?}表示法会生成错误。
最后一行应该是:

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时。

ygya80vv

ygya80vv2#

尝试使用bash运行它。

bash test.sh helloworld.zip

  • 同样地-
    “试着把第一行改成**#!/bin/bash**”作为评论-由- @shellter回答
6l7fqoea

6l7fqoea3#

bash中尝试:

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

根据您的需要进行调整。

相关问题