我需要理解这个命令行:
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 的唯一原因可能basename
是basename
实用程序不从标准输入读取,而是从标准输入读取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%%.*}
而不是cut
as善陀罗示.)
另一方面,如果它应该处理多个文件名,那么使用数组或在位置参数(所有参数,而不仅仅是$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
。