2012-05-02 42 views
0

我是shell脚本新手,我在给定的脚本中找到以下代码行。这是什么bash脚本代码行意味着

可能有人解释我这是什么代码以下行指

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

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

预先感谢任何帮助

+0

是printk还是printf? 并让它** Linux Shell脚本** – axiom

+1

** windows **脚本?真? –

+0

这个给我的脚本是写在windows上的,然后用dos2unix把它翻译成了unix脚本。所以我的想法是这是一个窗口可以理解的格式。 – KItis

回答

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是刚分配单词“回声”。看起来像一个写得不好的脚本。

printk没有在bash中定义,也不是来自coreutils的一个完善的gnu程序。

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

1

它将_filelist变量中的单词数存储到_filecount中。 阐述:

_filecount=``echo ${_filelist} | wc -w | awk '{ print $1 }'
你必须把它包下的单曲,这是规矩。

呼应给出了什么是存储在_filelistWC

WC(字计数器)接收到它(通过中间结果被称为管道),因为它是一个-w选项调用,它已经给出了唯一的单词数AWK,并保留线条和字符的数量。

awk依次打印出提供给它的第一列(awk'{print $ 1}'')。

wc这里只提供1列,字数,所以调用awk实际上是多余的。

printf "archiveWLS(): ${_filecount} file(s)"

替代_filecount的值转换成字符串,并给它输出到标准输出流,而这恰好是你的shell输出窗口。 就是这样。

0

这个脚本的功能基本上什么都没有。

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

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

由于出现echo其中不它被解释为只存在以下命令的持续时间的临时变量赋值,因此,环境变量_filecount将所述命令存储在运行期间具有echo的值变量_filelist;因为我想,_filelist不包含命令名称,而是包含一个或多个不可执行文件的名称,您将收到command not found错误。

该行的其余部分是无关紧要的。由于${_filelist}命令没有输出任何标准输出,因此没有任何东西被重定向到wc -wwc将报告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)" 

由于没有叫printk bash的内置并没有叫printk标准程序,其结果很可能是:

-bash: printk: command not found 

你可以有使用printf为此:

printf "archiveWLS(): ${_filecount} file(s)" 

And t他输出会

archiveWLS(): 0 file(s) 

0_filecount值。

虽然,这将是更好地说:

printf 'archiveWLS(): %s file(s)\n' "${_filecount}" 

将输出相同的上述情况,还包括在最后一个换行,并更容易维护。