`
qindongliang1922
  • 浏览: 2171579 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117086
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125435
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59509
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71021
社区版块
存档分类
最新评论

跟散仙学shell编程(四)

阅读更多
上篇介绍了for循环命令的使用,本篇的shell学习,我们来看下如何在shell环境下处理用户的输入,我们可以向运行的shell从外部传入一些参数,通常情况下
$0是程序名
$1是第一个参数
$2是第二个参数
依次类推知道第9个参数$9
第9个之后需要${10}以此,至无限的

[search@h1 812]$ cat a.sh 




echo "你输入的第一个数是: $1"



[search@h1 812]$ sh a.sh  2
你输入的第一个数是: 2
[search@h1 812]$ 


[search@h1 812]$ cat a.sh 




echo "你输入的第1个数是: $1"
echo "你输入的第2个数是: $2"

echo "你输入的第3个数是: $3"


[search@h1 812]$ sh  a.sh  4 5 898
你输入的第1个数是: 4
你输入的第2个数是: 5
你输入的第3个数是: 898
[search@h1 812]$ 


如果穿的是带空格的字符串,记得用双引号引起来即可。
多于10个参数的我们需要使用大括号来引用
[search@h1 812]$ cat aa.sh 




echo "第10个参数:  $10"
echo "第11个参数:  $11"




echo "第10个参数大括号:  ${10}"



[search@h1 812]$ sh aa.sh  1 2 3 4 5 6 7 8 9 a 11 12
第10个参数:  10
第11个参数:  11
第10个参数大括号:  a
[search@h1 812]$ 


$0可以获取程序名
[search@h1 812]$ cd
[search@h1 ~]$ sh 812/cc.sh 
程序名是: 812/cc.sh
[search@h1 ~]$ cd 812/
[search@h1 812]$ chmod u+x cc.sh 
[search@h1 812]$ ./cc.sh 
程序名是: ./cc.sh
[search@h1 812]$ 


如果只想要程序名,而不用带路径的话,可以使用basename命令来获取
[search@h1 ~]$ cat  812/cc.sh 




echo "程序名是: $0"



name=`basename $0`


echo "我永远只显示程序名: $name"

date
[search@h1 ~]$ sh 812/cc.sh   
程序名是: 812/cc.sh
我永远只显示程序名: cc.sh
2014年 08月 13日 星期三 03:54:57 CST
[search@h1 ~]$ 

我们可以通过-n来测试参数中是否有数据:
[search@h1 812]$ cat b.sh 




if [ -n "$1"  ] ; then
echo "有数据: $1"
else

echo "对不起,请输入数据: $1"
fi

[search@h1 812]$ sh b.sh 
对不起,请输入数据: 
[search@h1 812]$ sh b.sh  你好
有数据: 你好
[search@h1 812]$ 


如何知道参数总个数呢? s#命令可以满足我们

[search@h1 812]$ cat bb.sh 





echo "你输入总个数:  $#"
[search@h1 812]$ sh bb.sh  1 2 a b cc
你输入总个数:  5
[search@h1 812]$ sh bb.sh  1 2 a b 
你输入总个数:  4
[search@h1 812]$ sh bb.sh  
你输入总个数:  0
[search@h1 812]$ 

那么如何获取参数里面最后一个参数呢?
命令:  ${!#}
[search@h1 812]$ cat bb.sh 





echo "最后一个参数是: ${!#} "
[search@h1 812]$ sh bb.sh 
最后一个参数是: bb.sh 
[search@h1 812]$ sh bb.sh  2 a z
最后一个参数是: z 
[search@h1 812]$ 


如何获取所有的数据?
$*可以奖所有参数作为一个字符串显示出来
$@可以把所有参数当成一个数组来执行
[search@h1 812]$ cat d.sh 



echo "\$*  所有的:  $*"
echo "\$@  所有的:  $@"



#两者的区别

for var in "$*"
do

echo  "\$*的遍历是: $var"

done

echo "============================================="



for var in "$@"
do

echo "\$@的遍历是:  $var"


done






[search@h1 812]$ sh d.sh  1 2 a b 100
$*  所有的:  1 2 a b 100
$@  所有的:  1 2 a b 100
$*的遍历是: 1 2 a b 100
=============================================
$@的遍历是:  1
$@的遍历是:  2
$@的遍历是:  a
$@的遍历是:  b
$@的遍历是:  100
[search@h1 812]$ 


shift命令,可以来移位参数:

[search@h1 812]$ cat dd.sh 



echo "所有的参数是:   $*"


shift 2 


echo "移位后的参数是: $*"
[search@h1 812]$ sh dd.sh  1 3 9 00
所有的参数是:   1 3 9 00
移位后的参数是: 9 00
[search@h1 812]$ 

处理选项:
[search@h1 812]$ cat e.sh 



while [  -n "$1"  ]

do


  case "$1" in
  
  -a) echo "find the -a option" ;;
  -b) echo "find the -b option" ;;
  -c) echo "find the -c option" ;;
   *) echo "$1 is not an option" ;;
  
 esac
shift

done




  


[search@h1 812]$ sh e.sh  -a -b -c -d
find the -a option
find the -b option
find the -c option
-d is not an option
[search@h1 812]$ sh e.sh  -a
find the -a option


上面程序,充分利用了移位技术,来保证每个参数只会被处理一遍。

如何使选项与参数分离呢,我们可以使用--命令来做个小程序测试:
[search@h1 812]$ cat s.sh 



while  [  -n "$1" ]

do


   case "$1" in
     -a) echo "a exist";;
     -b) echo "b exist";;
     -c) echo "c exist";;
     -d) echo "d exist";;
     --) shift
         break;;
     *) echo "$1 is not an option"

esac

shift

done



for  var in "$@"

do

 echo "剩余的参数是:  $var"


done





    
[search@h1 812]$ sh s.sh  -a -b -e -- 1 2 3
a exist
b exist
-e is not an option
剩余的参数是:  1
剩余的参数是:  2
剩余的参数是:  3
[search@h1 812]$ 

下面看一个getopts命令,可以帮助我们处理选项与参数的关系:
$OPTARG 保存环境变量的值  $OPTID 保存了参数列表里面的位置
如果遇到了未知的参数,会以问号代替输出
[search@h1 812]$ cat g.sh 




while getopts :ab:c opt

do 


   case  "$opt" in
    a) echo "-a exist";;
    b) echo "-b exist,  with value $OPTARG";;
    c) echo "-c exist";;
    *) echo "unknow option  $opt";;

esac

done
[search@h1 812]$ sh g.sh -ab test1 -d
-a exist
-b exist,  with value test1
unknow option  ?
[search@h1 812]$ 


下面我们来看下如何在shell里面获取用户输入,就像我们在JAVA中使用Scanner对象获取键盘输入一样:
read命令会从键盘读入或从一个文件描述符里面读入数据,然后放进一个变量里面
[search@h1 812]$ cat r.sh 



echo -n "请输入你的名字:"

read name

echo "Hello $name "
[search@h1 812]$ sh r.sh 
请输入你的名字:jim
Hello jim 
[search@h1 812]$ sh r.sh 
请输入你的名字:dongliang
Hello dongliang 
[search@h1 812]$


我们还可以直接使用-p命令读入一行数据:
[search@h1 812]$ cat n.sh 




read -p "请输入你的年龄:" age

echo "你的年龄是: $age"
[search@h1 812]$ sh n.sh 
请输入你的年龄:23
你的年龄是: 23
[search@h1 812]$ sh n.sh 
请输入你的年龄:100
你的年龄是: 100
[search@h1 812]$ 

你可以在read时不指定变量名,系统默认会放在$REPLY

[search@h1 812]$ cat m.sh 



read -p "input name: "

echo "你输入的是: $REPLY"
[search@h1 812]$ sh m.sh 
input name: solr   
你输入的是: solr
[search@h1 812]$ 


除此之外,我们还可以对输入,设置个超时时间,如果一段时间内没人输入,就结束等待状态,程序退出!

[search@h1 812]$ cat q.sh 


if read -t 5 -p "请在5秒内输入名字:" name
then
echo "你好 $name"
else


echo  "对不起,你输入太慢了!"

fi
[search@h1 812]$ sh q.sh 
请在5秒内输入名字:a
你好 a
[search@h1 812]$ sh q.sh 
请在5秒内输入名字:对不起,你输入太慢了!
[search@h1 812]$ 


[search@h1 812]$ cat w.sh 



read -n1 -p "yes or no?" var

case $var in

 Y | y) echo "contine...";;
 N | n) echo "OK. bye bye"   

    exit ;;

esac

echo `date`

[search@h1 812]$ sh w.sh 
yes or no?ycontine...
2014年 08月 13日 星期三 05:37:10 CST
[search@h1 812]$ sh w.sh 
yes or no?nOK. bye bye
[search@h1 812]$ sh w.sh 
yes or no?z2014年 08月 13日 星期三 05:37:20 CST
[search@h1 812]$ 


-n后面的数字1,代码可以接受几个字符,而不必按回车键

下面看下隐藏方式读取数据:
[search@h1 812]$ cat p.sh 



read -s -p "请输入密码: " pwwd


echo "你的密码是: $pwwd"
[search@h1 812]$ sh p.sh 
请输入密码: 你的密码是: abc
[search@h1 812]$ sh p.sh 
请输入密码: 你的密码是: hahahah
[search@h1 812]$ 

最后看下如何从一个文件里面按行读取数据:

[search@h1 812]$ cat ccc.sh 



cat abc.txt | while read line
do


echo "数据: $line"

done






echo `date`

[search@h1 812]$ sh ccc.sh 
数据: 
数据: 
数据: a
数据: b
数据: cc
数据: dd the
数据: ee
2014年 08月 13日 星期三 05:45:23 CST
[search@h1 812]$ cat abc.txt 


a
b
cc
dd the 
ee
[search@h1 812]$ 

1
0
分享到:
评论

相关推荐

    跟老男孩学Linux运维:Shell编程实战

    《跟老男孩学Linux运维:Shell编程实战》第四部分为第14章~第16章,着重讲解Shell脚本开发规范与编码习惯、Shell脚本的调试知识和技巧、Shell脚本开发环境的配置调整和优化等。《跟老男孩学Linux运维:Shell编程实战...

    跟老男孩学Linux运维:Shell编程实战 PDF

    跟老男孩学Linux运维:Shell编程实战 PDF跟老男孩学Linux运维:Shell编程实战 PDF

    跟老男孩学Linux运维:Shell编程实战.pdf 高清 带书签

    资深运维架构实战专家及教育培训界*专家十多年的运维实战经验总结,全面系统地讲解运维工作中Shell编程所需的知识点和Shell编程的各种企业级案例。

    shell编程入门经典--LINUX与UNIX Shell编程指南 (中文pdf版)

    《LINUX与UNIX Shell编程指南》是一本专为初学者设计的shell编程教程,它深入浅出地介绍了在Linux和UNIX系统中如何使用Shell进行高效自动化任务处理。Shell编程是Linux和UNIX系统中的核心技术,它允许用户通过命令行...

    shell编程指南shell编程指南shell编程指南shell编程指南

    Shell编程是一种在Unix/Linux操作系统环境下进行系统管理与自动化任务的强大工具。它允许用户通过命令行接口执行各种操作,包括文件管理、程序控制、系统管理任务等。本指南将深入探讨Shell编程的基础知识、常用命令...

    shell编程学习资料

    Shell编程是Linux/Unix系统中不可或缺的一部分,它是一种命令行解释器,允许用户与操作系统进行交互,执行系统命令,以及编写脚本自动化任务。在本文中,我们将深入探讨Shell编程的基础知识,包括基本命令、变量、...

    Windows Shell 编程.pdf

    Windows Shell 编程.pdf 看过一些对windows 外壳的扩展程序,在使用上一般都是直接利用windows的外壳API做一些工作,因为外壳操作需要一些比较专业的知识,因此,大部分编程人员特别是使用集成编程环境的程序人员对...

    shell编程入门教程+shell脚本专家指南+UNIX.shell编程24小时教程.rar

    《shell编程入门教程》、《shell脚本专家指南》以及《UNIX.shell编程24小时教程》会提供详尽的实例和练习,帮助你巩固所学并深化理解。 总之,Shell编程是Linux/Unix环境中不可或缺的技能,它能够提高工作效率,...

    shell编程题目练习

    shell编程题目练习,练习基本的shell编程,学习脚本语言,提高效率

    跟老男孩学Linux运维:Shell编程实战 完整版 pdf

    跟老男孩学Linux运维:Shell编程实战 完整版 pdf

    Linux与UNIX Shell编程指南.pdf

    "Linux与UNIX Shell编程指南" Linux与UNIX Shell编程指南是计算机科学领域中一本经典的指南手册,旨在帮助读者快速掌握Linux与UNIX操作系统下的shell编程技术。下面是从该书中生成的相关知识点: 1. Shell概述 ...

    Windows Shell 编程指南与实例

    《Windows Shell 编程指南与实例》是一本深入探讨Windows操作系统壳层编程技术的专业书籍。在Windows系统中,Shell指的是用户界面,它为用户提供与操作系统交互的环境,包括桌面、开始菜单、快捷方式等。Shell编程则...

    Shell编程高级进阶系列视频.zip

    13Linux下Shell编程之While case演练 14Linux下Shell编程之While case演练 15Shell编程之函数及脚本案例讲解 16Shell编程之函数及脚本案例讲解 17Linux下Shell编程FIND、SED命令实战 18Linux下Shell编程FIND、SED...

    UNIX命令及SHELL编程

    这是一套完整的Unix培训教材,包括Unix常用命令及SHELL编程基础与高级技巧,PDF格式,共30个文件。另有2个Word文档。包内文件清单如下: 01_Shell-文件安全与权限.PDF 02_Shell-使用find和xargs.PDF 03_Shell-...

    Shell编程中文手册.pdf

    Shell 编程中文手册 本手册涵盖了 Shell 编程的基础知识,包括 Shell 概述、Shell 解析器、Shell 脚本入门、Shell 中的变量等。 Shell 概述 Shell 是一种命令行接口,允许用户与操作系统进行交互。学习 Shell ...

    Unix Shell Shell编程

    6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书

    shell编程个人笔记

    shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人...

    shell demo及编程pdf

    **Shell编程介绍** Shell编程是Linux/Unix操作系统中的一种脚本语言,用于自动化日常任务,交互式地控制操作系统,以及实现系统级别的程序间交互。它提供了命令行接口(CLI)来执行各种系统命令,使用户能够高效地...

    shell编程学习文档

    Shell学习的好帮手Shell学习的好帮手Shell学习的好帮手Shell学习的好帮手Shell学习的好帮手

Global site tag (gtag.js) - Google Analytics