加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

shell字符串坏替换

发布时间:2020-12-15 17:01:36 所属栏目:安全 来源:网络整理
导读:我知道这很愚蠢,但我是 shell的新手,我真的不知道这里发生了什么.以下是打算在zip文件被提取后获取目录名.因此,如果有效,结果将是这样的 $test.sh helloworld.ziphelloworld 我们来看看test.sh: #! /bin/shlength=echo `expr index "$1" .zip`a=$1 echo $(a
我知道这很愚蠢,但我是 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的最新版本,则 parameter expansion表示法应该有效.

在许多其他shell中,它不起作用,并且一个糟糕的替换错误就是shell说“你要求参数替换,但它对我没有意义”.

另外,给出脚本:

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

对于通过运行expr索引“$1”.zip生成的命令,第二行导出带有值echo的变量长度.它没有指定长度.那应该只是:

length=$(expr index "${1:?}" .zip)

如果未设置$1,则${1:?}表示法会生成错误(如果没有参数调用脚本).

最后一行应该是:

echo ${a:0:$length}

请注意,如果$1持有filename.zip,则expr索引$1 .zip的输出为2,因为字母i出现在filename.zip中的索引2处.如果打算获取没有.zip扩展名的文件的基本名称,那么经典的方法是:

base=$(basename $1 .zip)

更现代的方式是:

base=${1%.zip}

它们是有区别的;如果名称是/path/to/filename.zip,则经典输出是文件名,现代输出是/ path / to / filename.您可以通过以下方式获得经典输出:

base=${1%.zip}
base=${base##*/}

或者,在经典版本中,您可以获得以下路径:

base=$(dirname $1)/$(basename $1 .zip)`.)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读