如何在 bash 中的变量中保留提取的值

如何在 bash 中的变量中保留提取的值

我必须从目录中的某些文件名中提取某些值,并且我希望有一个命令将提取的值保留在变量中。假设我的文件具有以下格式place.type-date.log,我希望提取并保存在名为 的变量中first,我该怎么做?

我尝试使用

first=$($file | awk -F'[.-]' '{print $1}')

但没有成功。

通常如果我这样做

echo " place.type-date.log" | awk -F'[.-]' '{print $1}'

结果将是place.所以我刚刚更换了place.type-date.log$file在命令中替换为,因为我必须对使用 for 循环的特定目录中的多个文件执行此操作。

我想将提取的值存储place在变量中,first这就是为什么我将提取命令等同于变量first。因此,当我尝试echo first执行脚本时,它没有显示任何内容,这意味着提取的值尚未存储在变量中。

答案1

假设您有一个类似于place.type-date.log变量 中的文件名file,并且您希望将文件名的第一个点之前的部分存储在另一个名为 的变量中first。在这种情况下,您可以使用标准参数替换来做到这一点。

first=${file%%.*}

上面.*从值中删除了与 shell 模式匹配的最长后缀$file,并将结果存储在 中first

使用%代替%%会删除最短的匹配后缀,留下place.type-date.使用###代替%and%% 将删除前缀字符串而不是后缀字符串。

有关使用这些替换的另一个示例,请参阅我的答案你之前的问题


您的代码不起作用,因为$file是 string place.type-date.log,而不是命令。您可能尝试过做类似的事情

first=$( echo "$file" | awk -F '[.-]' '{ print $1 }' )

但这比需要的更复杂。它还存在一些有关文件名中的转义序列(可能echo会扩展)和包含换行符的文件名(awk是面向行的文本处理工具)的问题。

相关内容