Shell编程 | 脚本参数与交互及常见问题
在执行一个脚本程序时,会经常需要向脚本传递一些参数,并根据输入的参数值生成相应的数据或执行特定的逻辑。
向脚本传递参数
执行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]#
运行结果可以看出:
- 当变量个数大于输入的数据个数时,没有数据与之对应的变量的值为空;
- 当变量个数小于输入的数据个数时,最后一个变量会被赋予剩余的所有数据;
特殊变量
| 特殊变量及说明 | |
| 变量名 | 说明 |
| $# | 传递给脚本的参数个数 |
| $* | 传递给脚本的所有参数的值 |
| $@ | 与$*相同 |
| $$ | 脚本执行所对应的进程号 |
| $! | 后台运行的最后一个进程的进程号 |
| $- | 显示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 ~]#
Shell编程 | 脚本参数与交互及常见问题的更多相关文章
- Shell编程——脚本编写思路与过程
Linux系统Shell编程——脚本编写思路与过程 “ 前段时间有小伙伴问我一些问题,涉及到shell脚本的编写问题,事后,我深入思考了下,实际生产环境的确也会经常用到,因此如何写这个脚本?它的思路在 ...
- linux bash shell编程之参数变量和流程控制。
参数变量:用来向脚本中传递参数 我们在执行脚本的时候可以在其后面加入一些参数,通常来说这些参数与脚本中变量为对应关系. start.sh argu1 argu2 引用方式: $1,,2,……${10} ...
- shell 判断脚本参数
测试登陆脚本 ./test.sh -p 123 -P 3306 -h 127.0.0.1 -u root #!/bin/sh ];then echo "USAGE: $0 -u user - ...
- SHELL编程入门简介
一.SHELL软件概念和应用场景 1) 学习Linux技术,不是为了学习系统安装.命令操作.用户权限.配置IP.网络管理,学习Linux技术重点:基于Linux系统部署和维护各种应用软件.程序(Apa ...
- centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课
centos shell编程4[分发系统] 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要 ...
- shell编程学习笔记(五):Shell中脚本的参数
在执行Shell脚本的时候,可以在执行时带上参数,相当于传递参数给脚本,下面我们看一下怎么使用这个参数 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/script ...
- shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)
shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查) Shell脚本与MySQL数据库交互(增删改查) # 环境准备:安装mariadb 数据库 [ro ...
- 【shell】shell编程(五)-读取参数
通过前几篇文章的学习,我们学会了shell的基本语法.在linux的实际操作中,我们经常看到命令会有很多参数,例如:ls -al 等等,那么这个参数是怎么处理的呢? 接下来我们就来看看shell脚本对 ...
- shell编程系列23--shell操作数据库实战之mysql命令参数详解
shell编程系列23--shell操作数据库实战之mysql命令参数详解 mysql命令参数详解 -u 用户名 -p 用户密码 -h 服务器ip地址 -D 连接的数据库 -N 不输出列信息 -B 使 ...
随机推荐
- 剑指Offer-1.二维数组中的查找(C++/Java)
题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- Angular7入门总结篇
- 【2019.8.9 慈溪模拟赛 T1】数论(a)(打表找规律)
莫比乌斯反演 血亏! 比赛时看到这题先写了个莫比乌斯反演,然后手造了几组数据和暴力对拍的时候发现,居然答案就是\(nm\)... 吐槽数据范围太小... 下面给上出题人对此题的解释: 原式的物理意义, ...
- python实现异步调用函数执行
在实现异步调用之前我们先进行什么是同步调用和异步调用 同步:是指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执行第二个事务,顺序执行 异步:是和同步相对的,异步是指在 ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) B. TV Subscriptions 尺取法
B2. TV Subscriptions (Hard Version) The only difference between easy and hard versions is constraint ...
- Luogu P4341 [BJWC2010]外星联络
题目描述 暴力思路: 暴力枚举子串,插入trie树中,按字典序输出大于1的end的值 时间复杂度:n3 结果:TLE 0分 ...非常尴尬的一点不剩 正解思路 经过观察发现,可以只枚举后缀,统计时输出 ...
- 如果对象的引用被置为null,;垃圾回收器是否会立即释放对象占用的内存?
不会,在下一个垃圾回调周期中,这个对象将是被可回收的. 也就是说并不会立即被垃圾收集器立刻回收,而是在下一次垃圾回收时才会释放其占用的内存.
- 理解CMS GC日志
本文翻译自:https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs 准备工作 JVM的GC日志的主要参数包括如下几个:-XX:+ ...
- Unity开发实战探讨-资源的加载释放最佳策略简要心得
Unity开发实战探讨-资源的加载释放最佳策略简要心得 看过我另外一篇关于Unity资源释放随笔<Unity开发实战探讨-资源的加载释放最佳策略>如果觉得略微复杂,那么下面是一些比较简要的 ...
- mysql 写计数器需要注意的问题
MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能 由于并发的时候 不能同时写入一行数据 所以要分开写<pre>先创建表CREATE TABLE `article_view` ...