在上一篇文章中,我们介绍了如何在bash脚本中使用变量来响应各种数据和接收用户输入。今天我们将介绍如何通过命令行将变量作为参数传递给bash脚本。给bash传递参数下面的脚本count_lines.sh会输出用户指定文件的总行数:#!/bin/bashecho-n"请输入文件名:"readnlines=$(wc-l<$filename)echo"Thereareare$nlineslinesin$filename"例如,用户可以输入文件/etc/passwd,脚本会输出行数:脚本运行良好;但是,还有进一步优化的空间。我们可以让用户在运行脚本时简单地将文件名作为命令行参数传递,而不是提示用户输入文件名,如下所示:./count_lines.sh/etc/passwd第一个bash参数(也称为location参数)可以使用$1在bash脚本中访问。所以在count_lines.sh中,filename变量可以用$1代替,如下:#!/bin/bashnlines=$(wc-l?$1)ech??o"Thereare$nlineslinesin$1"我们去掉了第一个read命令和第一个脚本中的第一个echo命令,使脚本看起来更简洁。这样,运行脚本时,可以将文件名作为参数传递:./count_lines.sh/etc/group/etc/group中有73行传递多个参数可以一次传递多个参数给bash脚本时间。通常,以下是将多个参数传递给脚本的语法:script.sharg1arg2arg3第二个参数将由$2变量引用,第三个由$3引用,依此类推。这里大家可能会有疑问,第一个变量是$1,那么$0是用来做什么的呢?实际上$0变量用于bash脚本的名称。现在我们修改count_lines.sh脚本文件,让它可以统计多个文件的行数,如下:#!/bin/bashn1=$(wc-l?$1)n2=$(wc-l<$2)n3=$(wc-l?$3)echo"$1有$n1行"echo"$2有$n2行"echo"$3有$n3行"运行脚本并传递三个文件作为参数:如上图所示,脚本输出三个文件的行号;当然,不言而喻,输出的信息是按照文件的顺序排列的。linux中有很多命令从bashshell中的参数就想到了,有的比较复杂,比如语法长,或者选项多。但是我们可以通过使用bash参数将那些困难的命令变成非常简单的任务。看下面的find.sh脚本:#!/bin/bashfind/-iname$1这是一个非常简单但很有用的脚本,它提供一个文件名作为参数,脚本会打印出文件的位置:as从上图可以看出,这个脚本比单纯使用find命令要简单的多。这表明可以使用参数将Linux中更复杂的命令转换为更简单的bash脚本。2>上面脚本中的/dev/null是指将错误信息重定向到/dev/null,即不打印错误信息。可以参考:Linux中如何将输出和错误重定向到/dev/nullbashshell中的特殊变量bash中内置了很多特殊变量,使用起来非常方便。以下是最常见的:变量描述$0bash脚本名称$1,$2...$nbash脚本参数$$当前shell进程ID$#传递给脚本的参数总数$@传递给脚本的所有参数的值$?最后执行命令的退出状态$!最后执行的命令的进程ID。您实际上可以检查这些特殊变量。参考下面的variables.sh脚本:#!/bin/bashecho"脚本名称:$0"echo"参数总数:$#"echo"所有参数的值:$@"然后运行带有几个参数的脚本:
