这个命令行(`echo $1 | xargs -n 1 basename | cut -d '.' -f1`)有什么作用?

这个命令行(`echo $1 | xargs -n 1 basename | cut -d '.' -f1`)有什么作用?

我需要理解这个命令行:

file=`echo $1 | xargs -n 1 basename | cut -d '.' -f1`

答案1

它将文件名的一部分(可能带有路径)分配给变量file。具体来说,是.文件本身的文件名中第一个字符之前的位。换句话说,它需要类似的东西/some/path/hello.world并解析出该hello位。

一个技巧是在命令行上运行管道的每个部分:

$ thing="/some/path/hello.world"

$ echo "$thing"
/some/path/hello.world

$ echo "$thing" | xargs -n 1 basename
hello.world

$ echo "$thing" | xargs -n 1 basename | cut -d '.' -f 1
hello

反引号用于返回管道的输出并将其分配给file。这$1是命令行上的第一个参数(对于它所属的任何脚本或 shell 函数)。

xargs -n 1 basename使用而不是 plain 的唯一原因可能basenamebasename实用程序不从标准输入读取,而是从标准输入读取xargs

bash或中同一事物的更短(且更快)的版本ksh93

file=${1##*/}
file=${file%%.*}

答案2

$1该行从通过(该行出现的脚本的第一个参数)提供的路径中提取不带扩展名的文件名。结果保存在变量中file

演示:

$ echo /etc/dhcpcd.conf ../foo/bar/filename.tar.gz | xargs -n 1 basename | cut -d '.' -f1
dhcpcd
filename

答案3

echo和的组合xargs在这里相当奇怪。

basename在命令行上获取路径名,并输出它的最终组成部分(即通常在最后一个斜杠之后的部分)。xargs只需将从其输入(管道)读取的单词放置到basename此处的命令行即可。那么为什么不直接使用呢basename $1

然而,还是有区别的。

如果echo $1 | xargs -n 1 basename参数$1包含空格,xargs则将其拆分为空格,并basename分别调用每个单词。最终结果将是文件名的一部分将被选择全部这些词,如阿民念表明

另一个选项,basename $1,只会调用basename一次(并且由于分词而以一些好的方式失败。)

如果该命令只处理一个文件名,则最好写为:

file=$(basename "$1" | cut -d '.' -f 1)

带引号。 (或者使用后缀剥离 shell 扩展${file%%.*}而不是cutas善陀罗示.)

另一方面,如果它应该处理多个文件名,那么使用数组或在位置参数(所有参数,而不仅仅是$1)中传递它们可能会更干净。

答案4

该行将文件名(不带扩展名和路径)存储在变量 中$file

详细地:

echo $1打印传递给脚本的第一个命令行参数,xargs -n 1 basename将回显的字符串作为参数传递给 command basename,这会从文件名中删除路径。 cut -d '.' -f1删除扩展名。

因此,例如如果您执行

echo directory/test.sh | xargs -n 1 basename | cut -d '.' -f1

结果(保存到$file)将为test

相关内容