我必须从目录中的某些文件名中提取某些值,并且我希望有一个命令将提取的值保留在变量中。假设我的文件具有以下格式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
是面向行的文本处理工具)的问题。