我是 shell 脚本的新手,我在给定的脚本中发现了以下代码行。
有人可以解释一下以下代码行的含义
_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'
printk "archiveWLS(): ${_filecount} file(s)"
提前感谢您的帮助
_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 程序。
也许它是在脚本本身中定义的。
它将 _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 输出窗口。就是这样。
这个脚本所做的基本上什么都没有。
_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'
这行在语法上是有效的,但不太可能是正确的。
因为echo
出现在它所在的位置,它被解释为仅在以下命令期间存在的临时变量赋值,因此,环境变量_filecount
将echo
在命令运行期间存储在变量中的值为_filelist
; 因为,我想,_filelist
不包含命令名称,而是包含一个或多个非可执行文件的名称,你会得到一个command not found
错误。
该行的其余部分无关紧要。由于该${_filelist}
命令没有向 stdout 输出任何内容,因此没有任何内容被重定向到wc -w
. wc
将报告计算了 0 个单词,并且该值将传递给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
。
虽然,最好说:
printf 'archiveWLS(): %s file(s)\n' "${_filecount}"
这将输出与上述相同的内容,最后还包含一个换行符,并且更易于维护。