18

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

$test.sh helloworld.zip
helloworld

我们来看看test.sh:

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

但是我从编译器得到了错误的替换错误。

当我提到“shell”时。我只是在谈论 shell,因为我不知道 bash 或其他人之间的区别。我只是使用 Ubuntu 10.04 并使用终端。(我正在使用 bash。)

4

3 回答 3

17

如果您的 shell 是最新版本的bash,则该参数扩展表示法应该可以工作。

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


另外,给定脚本:

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

第二行导出带有运行生成的命令的length值的变量。它不分配给。那应该只是:echoexpr index "$1" .ziplength

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)`.)

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

于 2012-10-11T03:50:13.690 回答
8

尝试使用 bash 运行它。

bash test.sh helloworld.zip

-同样地-

“尝试将第一行更改为#!/bin/bash ”作为评论回答 – @shellter

于 2018-10-03T15:42:16.493 回答
1

试试看bash

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

调整它以满足您的需求。

于 2012-10-11T03:53:09.663 回答