0

我是 shell 脚本的新手,我在给定的脚本中发现了以下代码行。

有人可以解释一下以下代码行的含义

  1. _filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'

  2. printk "archiveWLS(): ${_filecount} file(s)"

提前感谢您的帮助

4

3 回答 3

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 程序。

也许它是在脚本本身中定义的。

于 2012-05-02T09:57:56.037 回答
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 输出窗口。就是这样。

于 2012-05-02T09:58:00.990 回答
0

这个脚本所做的基本上什么都没有。

_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'

这行在语法上是有效的,但不太可能是正确的。

因为echo出现在它所在的位置,它被解释为仅在以下命令期间存在的临时变量赋值,因此,环境变量_filecountecho在命令运行期间存储在变量中的值为_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}"

这将输出与上述相同的内容,最后还包含一个换行符,并且更易于维护。

于 2012-05-02T10:47:52.590 回答