在执行一个脚本程序时,会经常需要向脚本传递一些参数,并根据输入的参数值生成相应的数据或执行特定的逻辑。
向脚本传递参数
执行Shell脚本时可以带有参数,在Shell脚本中有变量与之对应进行引用。这类变量的名称很特别,分别是0、1、2、3...被称为位置变量。
位置变量是由 0 开始,其中 0 变量预留用来保存实际脚本的名字,1 变量对应脚本程序的第 1个参数,依次类推。与其他变量一样,可以在Shell 中通过“$”符号来引用位置变量的值。
[root@localhost 20190105]# vi paral.sh #!/bin/bash#显示脚本名echo 'The script name is '$0#显示第1个参数echo 'The 1th parameter is '$1#显示第2个参数echo 'The 2th parameter is '$2#显示第3个参数echo 'The 3th parameter is '$3#显示第4个参数echo 'The 4th parameter is '$4#显示第5个参数echo 'The 5th parameter is '$5#显示第6个参数echo 'The 6th parameter is '$6#显示第7个参数echo 'The 7th parameter is '$7#显示第8个参数echo 'The 8th parameter is '$8#显示第9个参数echo 'The 9th parameter is '$9[root@localhost 20190105]# ./paral.sh Ni hao , Nice to meet you !The script name is ./paral.shThe 1th parameter is NiThe 2th parameter is haoThe 3th parameter is ,The 4th parameter is NiceThe 5th parameter is toThe 6th parameter is meetThe 7th parameter is youThe 8th parameter is !The 9th parameter is //空值[root@localhost 20190105]#
用户交互
使用 read 命令可以从键盘上读取数据,然后赋给指定的变量,在Shell脚本中实现与用户的数据交互。
read命令的格式
read 变量1 [变量2...]
read命令可以从键盘上读取到多个变量的值,用户输入数据时,数据间以空格或者 Tab键作为分隔。
如果变量个数与输入的数据个数相同,则依次对应赋值;
如果变量个数大于输入的数据个数,则从左到右对应赋值;如果没有数据,则以之对应的变量为空;
如果变量个数少于输入的数据个数,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。
通过 read 命令读取键盘上输入的数据保存到变量中,同时把变量值显示在屏幕上,当用户输入 exit 时结束程序。
[root@localhost 20190105]# vi read1.sh #!/bin/bash#初始化变量的值input1='' #设置 input1 变量值为空input2='' #设置 input2 变量值为空input3='' #设置 input3 变量值为空input4='' #设置 input4 变量值为空#until 循环,当 input1 变量的值为 exit 时退出该循环until [ "$input1" = exit ]do echo 'Please input the values:'#读取键盘输入的数据 read input1 input2 input3 input4#输入的不是 exit 时把用户输入的数据显示在屏幕上 if [ "$input1" != exit ] then echo 'input1: '$input1 #输出变量 input1 的值 echo 'input2: '$input2 #输出变量 input2 的值 echo 'input3: '$input3 #输出变量 input3 的值 echo 'input4: '$input4 #输出变量 input4 的值 echo#当输入为 exit 时显示退出脚本的提示 else echo 'Exit the script.' fidone[root@localhost 20190105]# chmod +x read1.sh [root@localhost 20190105]# ./read1.sh Please input the values:How do you do //输入的数据个数与变量个数相等input1: Howinput2: doinput3: youinput4: doPlease input the values:Welcome to beijing //输入的数据个数小于变量个数input1: Welcomeinput2: toinput3: beijinginput4: Please input the values:let's go //输入的数据个数小于变量个数input1: let'sinput2: goinput3: input4: Please input the values:Nice to meet you,too! //输入的数据个数大于变量个数input1: Niceinput2: toinput3: meetinput4: you,too!Please input the values: //结束程序exitExit the script.[root@localhost 20190105]#
运行结果可以看出:
- 当变量个数大于输入的数据个数时,没有数据与之对应的变量的值为空;
- 当变量个数小于输入的数据个数时,最后一个变量会被赋予剩余的所有数据;
特殊变量
特殊变量及说明 | |
变量名 | 说明 |
$# | 传递给脚本的参数个数 |
$* | 传递给脚本的所有参数的值 |
$@ | 与$*相同 |
$$ | 脚本执行所对应的进程号 |
$! | 后台运行的最后一个进程的进程号 |
$- | 显示Shell使用的当前选项 |
$? | 显示命令的退出状态,0:正确,1:错误。 |
[root@localhost 20190105]# vi vall.sh#!/bin/bashecho 'The value of $# is: '$# //输出$#变量的值echo 'The value of $* is: '$* //输出$*变量的值echo 'The value of $@ is: '$@ //输出$@变量的值echo 'The value of $$ is: '$$ //输出$$变量的值echo 'The value of $! is: '$! //输出$!变量的值echo 'The value of $- is: '$- //输出$-变量的值echo 'The value of $? is: '$? //输出$?变量的值[root@localhost 20190105]# ./vall.sh how do you doThe value of $# is: 4 //输出4变量的值The value of $* is: how do you do //输出how do you do变量的值The value of $@ is: how do you do //输出how do you do变量的值The value of $$ is: 9040 //输出9040变量的值The value of $! is: //输出变量的值The value of $- is: hB //输出hB变量的值The value of $? is: 0 //输出0变量的值[root@localhost 20190105]#
Shell编程常见问题
-
如何屏蔽命令的输出结果
Linux 默认会创建一个设备文件/dev/null(空设备),所有输出到该设备的信息都会被屏蔽。通过把命令的输出重定向到设备/dev/null,可以屏蔽命令的输出结果。
命令 > /dev/null
屏蔽命令的错误输出
命令 2> /dev/null
屏蔽命令的正常以及错误输出
命令 > /dev/null 2> /dev/null
例如:要在 Shell 代码中使用 grep 命令查找文件是否存在某个关键字,但是又希望屏幕 grep 命令的输出。
if grep jack /etc/passwd > /dev/nullthen echo "jack found"fi
如果 /etc/passwd 文件中有 jack 关键字的信息,将会显示 jack found,但不会输出 grep 命令的执行结果。
-
如何把一条命令分成多行编写
Linux 的 Shell 脚本功能非常强大,它允许用户通过管道方式把多个命令组合在一起,但因此往往也导致在一行 Shell 脚本代码中编写的命令过长,难以阅读,为了使脚本的结构更加清晰,可以把一行 Shell 脚本代码分成多行进行编写。
使用两个管道符把ps、grep 和 awk 命令组合。
[root@localhost ~]# ps -ef | grep sshd | awk '{print $2}'44781282122028
在一行代码中把多个命令组合在一起,难以阅读。Shell 提供了一个特殊字符“\”,可以把一行代码分成多行进行编写。
[root@localhost ~]# ps -ef | \> grep ssh | \> awk '{print $2}'44781282123375[root@localhost ~]#