在执行一个脚本程序时,会经常需要向脚本传递一些参数,并根据输入的参数值生成相应的数据或执行特定的逻辑。

向脚本传递参数

执行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.sh
The 1th parameter is Ni
The 2th parameter is hao
The 3th parameter is ,
The 4th parameter is Nice
The 5th parameter is to
The 6th parameter is meet
The 7th parameter is you
The 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.'
fi
done
[root@localhost 20190105]# chmod +x read1.sh
[root@localhost 20190105]# ./read1.sh
Please input the values:
How do you do //输入的数据个数与变量个数相等
input1: How
input2: do
input3: you
input4: do Please input the values:
Welcome to beijing //输入的数据个数小于变量个数
input1: Welcome
input2: to
input3: beijing
input4: Please input the values:
let's go //输入的数据个数小于变量个数
input1: let's
input2: go
input3:
input4: Please input the values:
Nice to meet you,too! //输入的数据个数大于变量个数
input1: Nice
input2: to
input3: meet
input4: you,too! Please input the values: //结束程序
exit
Exit the script.
[root@localhost 20190105]#

运行结果可以看出:

  1. 当变量个数大于输入的数据个数时,没有数据与之对应的变量的值为空;
  2. 当变量个数小于输入的数据个数时,最后一个变量会被赋予剩余的所有数据;

特殊变量

特殊变量及说明
变量名 说明
$# 传递给脚本的参数个数
$* 传递给脚本的所有参数的值
$@ 与$*相同
$$ 脚本执行所对应的进程号
$! 后台运行的最后一个进程的进程号
$- 显示Shell使用的当前选项
$? 显示命令的退出状态,0:正确,1:错误。
[root@localhost 20190105]# vi vall.sh
#!/bin/bash
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: '$- //输出$-变量的值
echo 'The value of $? is: '$? //输出$?变量的值
[root@localhost 20190105]# ./vall.sh how do you do
The 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/null
then
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}'
4478
12821
22028

在一行代码中把多个命令组合在一起,难以阅读。Shell 提供了一个特殊字符“\”,可以把一行代码分成多行进行编写。

[root@localhost ~]# ps -ef | \
> grep ssh | \
> awk '{print $2}'
4478
12821
23375
[root@localhost ~]#

最新文章

  1. Python Logging模块的简单使用
  2. java-生成印章swing
  3. Socket通讯
  4. C语言 百炼成钢10
  5. ES+Hbase对接方案概述
  6. jsoncpp代码实例
  7. 测试一个函数的运行时间(C++)
  8. Java基础知识强化之IO流笔记44:IO流练习之 复制图片的 4 种方式案例
  9. 11-C#反射机制
  10. CentOS7.1 使用资源搜集
  11. [Spring入门学习笔记][Spring的AOP原理]
  12. ※编程随笔※=>☆编程基础☆=>※№ SVN工具自动属性 $Author$ $Date$ $Revision$ $URL$ $Header$替换
  13. React Native是一套使用 React 构建 Native app 的编程框架
  14. Erlang虚拟机的启动
  15. poj 2065 高斯消元(取模的方程组)
  16. 【转】一文掌握 Linux 性能分析之 I/O 篇
  17. EasyUI动画效果
  18. jquery中的 deferred之 deferred对象 (一)
  19. \r\n回车换行\r回车\n换行的区别
  20. BZOJ2095:[POI2010]Bridges(最大流,欧拉图)

热门文章

  1. Springboot项目启动不了。也不打印任何日志信息。
  2. 《为什么说Redis是单线程的以及Redis为什么这么快!》
  3. JavaScript对象及初识面向对象
  4. Python 文件readlines()方法
  5. h5py报错:FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  6. SAP MM模块相关透明表收集
  7. C# 截图ScreenCapture,保存
  8. WPF两个按钮来回切换样式
  9. C 补充
  10. Python学习笔记之unittest测试类