浅谈Shell脚本参数与交互及常见问题

目录
  • 一、Shell编程-脚本参数与交互及常见问题
    • 1.1 向脚本传递参数
    • 1.2 用户交互
    • 1.3 特殊变量
    • 1.4 Shell编程常见问题
      • 1.4.1 如何屏蔽命令的输出结果
      • 1.4.2 如何把一条命令分成多行编写

一、Shell编程-脚本参数与交互及常见问题

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

1.1 向脚本传递参数

执行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]#

1.2 用户交互

使用 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.3 特殊变量

特殊变量及说明

[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]#

1.4 Shell编程常见问题

1.4.1 如何屏蔽命令的输出结果

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 命令的执行结果。

1.4.2 如何把一条命令分成多行编写

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脚本参数与交互内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈shell脚本免交互的四大方法

    在写shell脚本的过程中,我们经常碰到一些操作需要我们取实时指定一些参数,这就需要用到免交互了.免交互让我们的shell脚本更加强大. 介绍几种免交互的方式 1.管道符 不同命令间协调工作,位于 | 左侧命令的输出结果,将作为右侧命令的输入(处理对象) 例1 免交互修改账户密码 vim pswd.sh #!/bin/bash echo "Abc1357 Abc1357" | passwd --stdin yu [root@node1 ~]# sh pswd.sh 更改用户 yu 的密

  • Shell脚本之Expect免交互的实现

    Expext概述 Expect是建立在tcl基础上的一个工具,Expect是用来自动化控制和测试的工具.主要解决shell脚本中不可交互的问题.有助于大规模的系统运维工作.在日常的运维与开发中,常常需要运城登录到服务器,然而登录的过程却是个需要交互的过程,可能会要输入yes/no等信息,使用Expect脚本即可实现免交互操作. Expect安装 挂载光盘 制作本地YUM源 执行安装命令 yum install expect -y 基本命令 send 向进程发送字符串,用于模拟用户的输入,该命令不

  • Shell脚本中非交互式修改密码的两种方法

    今天在写一个shell脚本的时候发现需要设置用户的密码,而设置密码是交互式的,这样在脚本中显然是不太好的,因此上网查找资料,发现了以下两种常见的非交互式设置密码的方式: 1:使用chpasswd chpasswd其实是通过用户输入'用户名:密码'来更改一组用户的密码,还是一个可以批量修改密码的工具,具体的用法详见chpasswd用法,这里只做简单的介绍 格式:# echo 用户名:密码 | chpasswd 实例: 添加一个doiido的帐号,密码为123456 复制代码 代码如下: # ech

  • 浅谈Shell脚本参数与交互及常见问题

    目录 一.Shell编程-脚本参数与交互及常见问题 1.1 向脚本传递参数 1.2 用户交互 1.3 特殊变量 1.4 Shell编程常见问题 1.4.1 如何屏蔽命令的输出结果 1.4.2 如何把一条命令分成多行编写 一.Shell编程-脚本参数与交互及常见问题 在执行一个脚本程序时,会经常需要向脚本传递一些参数,并根据输入的参数值生成相应的数据或执行特定的逻辑. 1.1 向脚本传递参数 执行Shell脚本时可以带有参数,在Shell脚本中有变量与之对应进行引用.这类变量的名称很特别,分别是0

  • 浅谈shell脚本中的控制流结构

    习惯了c/c++的编程环境,再转到shell编程上,总有那么一点陌生的感觉. shell中一般的if-then-else函数格式无外乎如下: if 条件1 then 命令1 elif 条件2 then命令2 else 命令3 fi 而linux中 若命令退出状态为0,则退出成功,无错误: 若退出状态为1,则退出失败,某处有错误. if-then-else-函数中,条件1为条件测试,若条件1返回为0,表示测试为真,执行命令1:反之,返回1,则执行elif. 亦即以条件是否测试成功为if的判断标准,

  • 浅谈python脚本设置运行参数的方法

    正在学习Django框架,在运行manage.py的时候需要给它设置要监听的端口,就是给这个脚本一个运行参数.教学视频中,是在Eclipse中设置的运行参数,网上Django大部分都是在命令行中运行manage.py时添加参数,没有涉及到如何在pycharm中设置运行参数.以下是两种设置运行参数的方法(以manage.py为例),不设置运行参数时,运行结果为 D:\Python2.7\python.exe "D:/Django project/DjangoProject1/manage.py&q

  • 浅谈CI脚本异常退出问题定位

    背景 在CI脚本中,使用类似如下脚本进行项目编译的计时,但在执行过程中,有时会出现CI脚本(命名为ci.sh)未完全执行的情况: #!/bin/bash -e sleep_time=$1 start_time=`date "+%s"` # do sth, this sleep would simulate project compilation sleep $sleep_time end_time=`date "+%s"` process_time=`expr \(

  • 浅谈Shell中的函数

    函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell也支持函数.Shell函数必须先定义后使用. 1.Shell函数的定义格式 可以带function关键字使用function fun_name()来定义,也可以直接给出函数名fun_name()定义.不能带任何参数,函数名必须唯一,使时可以传递参数,使用$1,$2,...,$* ,$@来获取参数.建议使用function关键字来定义函数,便于代码阅读.定义格式如下: function

  • 浅谈shell循环中变量的作用域问题

    最近实现了一个shell脚本,功能简单来说就是从文件中按行读取然后将所有行拼接成一行写入一个文件,关键代码如下 path_all="" cat $1 | while read line do if [ "$path_all" == "" ];then path_all=$line else path_all=$path_all,$line fi done echo $path_all > $one_file 结果执行结果竟然是空!按照常理s

  • 浅谈Shell 流程控制

    和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); } else { // 不做任何事情 } 在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else. if else if if 语句语法格式: if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符):

  • 浅谈Linux 脚本 sh 和 ./ 的区别

    如果.不在PATH里面,要执行当前目录下的可执行文件,使用全路径: ./executable-file PATH是环境变量,如果将当前目录"./"添加到环境变量中,那么也可以不用"./",直接输入当前目录下有可执行权限的可执行文件就可以运行了 如果要执行一个sh脚本,不管那个脚本有没有可执行权限,都可以使用: sh [file] 这时file是作为参数传给sh的,如果file不在当前目录下,也需要使用全路径. 全路径有绝对路径和相对路径两种../和../开头的都是相

  • 浅谈vue-router2路由参数注意的问题

    1.vue 路由 如果传递 params 定义路由的时候是 /路由名称:id 获取的时候 this.$route.params.id 最后形如 /路由名称/路由参数 传参的时候 params:{ str1:str1, str2:str2 } 2.如果传递query ?id=str.... 定义路由的时候直接是 /路由名称 获取的时候 this.$route.query.id 传参的时候 data:{ str1:str1, str2:str2 } 以上这篇浅谈vue-router2路由参数注意的问

随机推荐