shell脚本中的Unix substr?
我有一个类似sample.txt.pgp的字符串,我想在shell脚本中返回sample.txt(但是,字符串长度会有所不同,因此基本上是“.pgp”之前的所有字符)。是否有一个substr函数?就像,如果我做substr('sample.txt.pgp', -4, 0)
,它应该返回sample.txt?现在它不是,所以我想知道如果我的语法错了,或者substr不是函数?shell脚本中的Unix substr?
您可以使用basename
:
$ basename sample.txt.pgp .pgp
sample.txt
使用反引号或$()
把结果在一个变量,如果你想:
$ FILE=sample.txt.pgp
$ VARIABLE=$(basename "$FILE" .pgp)
$ echo $VARIABLE
sample.txt
a='sample.txt.pgp'
echo ${a%.*} # sample.txt (minimal match)
echo ${a%%.*} # sample (maximal match)
这看起来很有趣......美元符号和%代表什么?你有一个网页有点解释这个或任何东西? – TwixxyKit 2010-03-24 20:59:00
@KnockKnockWhosThere:请阅读http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02了解更多信息。 :-) – 2010-03-24 21:00:44
而一个更受限制的版本:'$ {a%.pgp}'只会删除一个'.pgp'扩展名(如果存在的话);原文将根本删除任何扩展名(这在某些情况下可能有用)。 – 2010-03-24 21:27:14
有趣的是,你使用'-s后缀'符号;这不是由POSIX标准化的;经典符号将是'$(basename $ file .pgp)'(假设名称保存在变量'$ file'中)。 – 2010-03-24 21:25:44
@Jonathan是的!我刚刚在我的OS X机器上做了一个'man basename',并且看到了'-s'选项;它有点更灵活(可以处理多个字符串),我不知道它不是POSIX。我会编辑我的答案。 – 2010-03-24 21:40:00
已编辑;我也放了一些双引号来支持文件名中的空格。 – 2010-03-24 21:41:59