这个bash脚本代码行意味着什么

时间:2012-05-02 09:46:11

标签: bash shell

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

有人可以解释一下以下代码行是什么意思

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

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

  3. 提前感谢您提供任何帮助

3 个答案:

答案 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

将输出与上面相同的内容,最后还包括换行符,并且更易于维护。