这个问题可能已经被问过了,但我不知道怎么说得好。我是bash脚本的新手......
假设我在目录中有一堆文件,其名称如下:
file1_pre.ext
file2_pre.ext
file3_pre.ext
different_tmp.ext
我可以使用通配符来过滤感兴趣的文件:
for f in *_pre.ext
do
echo $f
done
但是我如何解析/提取前缀以便我可以将字符串file1
,file2
等用作其他内容的文件名?
答案 0 :(得分:3)
${f%_pre.ext}
将扩展为f
的值,并删除最终_pre.ext
。
使用${varname<SomeOperator>args}
进行参数扩展时,可以执行多种字符串操作。 %
运算符删除尾随字符串。它需要一个通配符参数,因此您可以执行${f%_*}
之类的操作来删除下划线后的所有内容。如果你将%
翻倍,就像${f%%_*}
一样,它会删除最长的匹配,所以你会在第一个下划线后杀死所有内容。单%
执行最短匹配,因此它会删除 last 下划线后的所有内容。使用%_pre.ext
因为我们正在寻找完全匹配,所以它没有什么区别。
#
和##
运算符类似于%
和%%
,但是在字符串的开头而不是结尾处工作。
另一个常用示例是:-
运算符,如果变量为空,则替换默认值。
另外,没有运算符的${foo}
是写$foo
的另一种方式,但是当你想在变量的值之后立即放置一些文本时,它可以帮助你:
echo $foobar # oops, looks for variable called "foobar"
echo ${foo}bar # the value of variable "foo" then literal "bar"
有关完整列表,请参阅任何shell手册页的“参数扩展”部分。