[英]shell string bad substitution
我是 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。)
如果您的 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)`.)
如果文件名可以包含空格,则需要考虑使用双引号,尤其是在basename
和dirname
的调用中。
尝试用 bash 运行它。
bash test.sh helloworld.zip
-同样地-
“尝试将第一行更改为#!/bin/bash ”作为评论回答 – @shellter
在bash
尝试:
echo $1
len=$(wc -c <<< "$1")
a="${1}.zip"
echo ${a:0:$len}
调整它以满足您的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.