将文件名中的字符串转换为 BASH shell 中的变量

Turn strings from a filename into variables in BASH shell

例如:

file-name-has-this-length.nfo

进入,

assign var1=file
assign var2=name
assign var3=has
assign var4=this
assign var5=lenght
assign ext=.nfo   # ext with or
                   #    without period 

去掉任何分隔符 - _ .

我最初的想法(但不限于)是根据文件名创建单独的目录。以及任何未来的脚本使用这些名称作为参考。

EDIT: I didn't find anything about "separate strings from file [names] to store their respective values". If you think this question should be moved to some other place just do it, but I need this problem solved.

This is not a duplicated!

欢迎来到 SO。请在门口检查一下你的态度,你会得到更多的答案。 IFSread<<< 都是 bash 元素,在 bash 教程中有解释。您应该进行自己的研究。

话虽这么说...

@Fravadona 提议:

IFS='-_.' read -r -a parts <<< "file-name-has-this-length.nfo"

这会将文件名拆分成一个数组,其中每个元素都是文件名中的一个字符串。拆分是在 IFS 变量中定义的字符上完成的。您可以在此处阅读 IFS https://www.baeldung.com/linux/ifs-shell-variable(以及您可以搜索的其他内容)。在bash.

中使用IFS分割字符串是常用的方法

所以:

parts[0] ==> file
parts[1] ==> name
parts[2] ==> has
parts[3] ==> this
parts[4] ==> length
parts[5] ==> nfo

此解决方案不对文件名中的字数做出任何假设。一个数组可以包含任意数量的元素,所以这是最好的——通用的——解决方案。您可以假设数组中的最后一项(最高索引)是扩展名。

使用数组,您可以遍历项目以创建目录。有关如何使用数组的许多提示,请参阅 https://opensource.com/article/18/5/you-dont-know-bash-intro-bash-arrays

如果您可以假设文件名将始终具有相同数量的元素,您可以这样做:

#!/bin/bash

IFS='-_.' read -r -a parts <<< "file-name-has-this-length.nfo"

var1="${parts[0]}"
var2="${parts[1]}"
var3="${parts[2]}"
var4="${parts[3]}"  
var5="${parts[4]}"
ext="${parts[5]}"


echo "$var1"
echo "$var2"
echo "$var3"
echo "$var4"
echo "$var5"
echo "$ext"

关于您的问题:

1.它们是专门为 Bash 或 Linux API 内置的吗?

这一切都是纯粹的bash,没有任何诡计。

2。如何更改变量的名称

看上面的代码,var1,var2,...可以随便改。

3。好想了解一下背后的过程

这不是问题,请阅读数组用法并提出具体问题。

4.这是做事的实用方法还是只是一个技巧

这是实现它的实用方法。 Bash 是灵活的,如果它满足你的要求,就可以了。阅读 bash 教程后,您可以在此常见问题解答中阅读更多高级概念:http://mywiki.wooledge.org/BashFAQ