AI智能
改变未来

浅谈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.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]#

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 ]doecho \'Please input the values:\'#读取键盘输入的数据read input1 input2 input3 input4#输入的不是 exit 时把用户输入的数据显示在屏幕上if [ \"$input1\" != exit ]thenecho \'input1: \'$input1                  #输出变量 input1 的值echo \'input2: \'$input2                  #输出变量 input2 的值echo \'input3: \'$input3                  #输出变量 input3 的值echo \'input4: \'$input4                  #输出变量 input4 的值echo#当输入为 exit 时显示退出脚本的提示elseecho \'Exit the script.\'fidone[root@localhost 20190105]# chmod +x read1.sh[root@localhost 20190105]# ./read1.shPlease 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]#

运行结果可以看出:

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

1.3 特殊变量

特殊变量及说明

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

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/nullthenecho \"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}\'44781282122028

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

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

到此这篇关于浅谈Shell脚本参数与交互及常见问题的文章就介绍到这了,更多相关Shell脚本参数与交互内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

  • 浅谈shell脚本免交互的四大方法
  • Shell脚本之Expect免交互的实现
  • Shell脚本中非交互式修改密码的两种方法
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 浅谈Shell脚本参数与交互及常见问题