我是shell脚本的新手,我在给定的脚本中找到了以下代码行。
有人可以解释一下以下代码行是什么意思
_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'
printk "archiveWLS(): ${_filecount} file(s)"
提前感谢您提供任何帮助
答案 0 :(得分:2)
_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'
wc -w
:wc是字数,wordcount计算字,行,字符等,-w只输出字数。
输出通过管道传输到awk,仅打印输出的第一个字。如果你使用
wc -w FILE
文件名将被打印,用awk将其剥离是有意义的。使用管道输出(没有文件名)这样做是非常容易的。
作为作业,该行应改为:
_filecount=$(echo ${_filelist} | wc -w )
没有$(...)或反引号,它不起作用,并且filecount只被赋予单词“echo”。看起来像一个写得不好的剧本。
printk没有在bash中定义,也不是来自coreutils的完善的gnu程序。
也许它是在脚本本身中定义的。
答案 1 :(得分:1)
它将_filelist变量中的单词数存储到_filecount中。 详述:
_filecount=
`echo ${_filelist} | wc -w | awk '{ print $1 }'
`
你必须将它包装在`s下,因为这是规则。
echo 会将 _filelist 中存储的内容显示为 wc 。
wc(字计数器)接收它(这个中间结果的传递被称为管道),并且因为它是用 -w 选项调用的,所以它已经只发出 awk 的字数,并保留行和字符的数量。
awk 反过来打印出提供给它的第一列(awk'{print $ 1}'`)。
wc 这里只提供1列,即单词计数,所以实际上调用 awk 是多余的。
printf "archiveWLS(): ${_filecount} file(s)"
将_filecount的值替换为字符串,并将其输出到标准输出流,这恰好是您的shell输出窗口。 就是这样。
答案 2 :(得分:0)
这个脚本的功能基本上没什么。
_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'
这一行在语法上是有效的,但不太可能是正确的。
由于echo
出现在它所在的位置,因此它被解释为临时变量赋值,仅在以下命令的持续时间内存在。因此,环境变量_filecount
的值为{{ 1}}在运行存储在变量echo
中的命令期间;因为,我想,_filelist
不包含命令名称,而是包含一个或多个非可执行文件的名称,您将收到_filelist
错误。
其余部分无关紧要。由于command not found
命令不向stdout输出任何内容,因此没有任何内容重定向到${_filelist}
。 wc -w
会报告计算出的0个单词,此值将传递给wc
,这将删除前导空格。
你可能想说的更像是
awk
将执行_filecount=$(echo ${_filelist} | wc -w | awk '{ print $1 }')
管道并将结果存储在echo
变量中。
将文件列表存储在这样的以空格分隔的字符串中是不是一个好主意(一方面,文件名称中可以有空格),而是使用_filecount
数组,如下所示:
bash
您可以将其扩展为_filelist=("file1.txt" "file2.txt")
的文件列表,所有文件都已正确引用,现在您可以通过这种方式获取文件数:
"${_filelist[@]}"
哪个更快(在进程中执行而不是调用外部实用程序)并且更可靠(不依赖于“一个文件是一个单词”语义)。
关于这一行:
_filecount=${#_filelist[@]}
由于没有名为printk "archiveWLS(): ${_filecount} file(s)"
的bash内置版,并且没有名为printk
的标准实用程序,因此结果很可能是:
printk
你可以使用-bash: printk: command not found
:
printf
输出将是
printf "archiveWLS(): ${_filecount} file(s)"
其中archiveWLS(): 0 file(s)
是0
的值。
虽然,这样说会更好:
_filecount
将输出与上面相同的内容,最后还包括换行符,并且更易于维护。