我有点挣扎。当我编写一个ksh脚本时,我需要提取一个字符串的子字符串,其中分隔符的出现次数是灵活的。
这是因为我的String保存了可能被压缩多次的文件的名称,因此具有多于1个点(。)。这些点将是我的分隔符,但由于供应商可能在文件名中包含版本号(例如software-v.3.2.4.tar.gz),我发现没有删除最后一个后缀。
进展情况如下:
文件名保存在变量中。文件首次解压缩。 (取.gz后缀远离文件)现在我需要提取.tar存档。但我的命令仍然是.gz后缀。命令不起作用,因为文件不再具有后缀。
如何获取变量的后缀。我无法保证分隔符的数量保持不变。
我尝试了几种组合转|凝乳'。' |转,但在这种情况下我只得到后缀。
我还尝试使用文件的实际名称再次初始化$ fileName变量,但因此我需要搜索整个目录。我尽力避免这种情况。
...
fileName="whole file name"
pathTo="path in which it should be moved after decompression"
if [ "$fileType" = "gz" ]; then
gzip $pathTo$fileName -d $pathTo
#Problem occurs right here
tar xfv $pathTo$fileName -C $pathTo
else
echo "Unknown Filetype. Cannot decompress. Script stopped."
exit
fi
...
我感谢任何帮助。电贺
Yonkske
不要使用| rev | cut -d'.' -f 1 | rev
但使用| rev | cut -d'.' -f 2- | rev
变量替换是这里最好的选择,因为它是一个内置的shell也是最快的。
filename='software-v.3.2.4.tar.gz'
echo ${filename##*.}
输出将是gz
这不会修改变量$ filename的值。
if [[ "${filename##*.}" == "gz" ]]; then
它是如何工作的,
${var#pattern}
- 删除与左侧模式匹配的文本后使用var的值
${var##pattern}
- 与上面相同,但删除最长的匹配件而不是最短的匹配件
${var%pattern}
- 删除与右侧模式匹配的文本后使用var的值
${var%%pattern}
- 与上面相同,但删除最长的匹配件而不是最短的匹配件
还有更多,但这是相关的。
这个限制他们不能嵌套。