shell基础05 处理用户输入

1.  命令行参数------类似javac  参数1 参数2

     类似Java中编译的javac parm1....。在shell中,参数与参数之间用空格隔开。采用位置参数来识别对应的参数值:$0是程序名,$1是第一个参数,以此类推,知道第9个参数$9。对于大于9个参数的需要在变量数字周围添加花括号,比如${10}。

     note:命令行上不仅可以处理数值,还可以处理字符串。

 1 [Hermioner@localhost Documents]$ cat test2.sh
 2 #!/bin/bash
 3 total=$[ $1*$2 ]
 4 echo The first parm is $1
 5 echo The second parm is $2
 6 a=$3
 7 echo the third parm is $3
 8 b=$4
 9 echo the forth parm is $4
10 [Hermioner@localhost Documents]$ bash test2.sh 2 3 "hello world" min
11 The first parm is 2
12 The second parm is 3
13 the third parm is hello world
14 the forth parm is min
View Code
1 [Hermioner@localhost Documents]$ cat test3
2 #!/bin/bash
3 echo the tenth parm is ${10}
4 echo the eleventh parm is ${11}
5 [Hermioner@localhost Documents]$  bash test3 1 2 3 4 5 6 7 8 9 10 11
6 the tenth parm is 10
7 the eleventh parm is 11
8 [Hermioner@localhost Documents]$ 
View Code

      note: $0返回脚本名,如果用bash,就只返回脚本名;如果./脚本来运行,返回当前路径名;  因此,还可以尝试basename命令来返回不包含路径的脚本名。

2. $#,$*,$@,${!#}

    s#      用来统计命令行的参数个数

    s*       用来访问所有的命令行参数,并且构成一个字符串整体输出

    s@     同s*,只是结果是分散成字符串数组,每个数组中的元素都是一个参数

    ${!#}   代表的最后一个参数,因为花括号中不可以用$,因此用!来代替它

 1 [Hermioner@localhost Documents]$ cat testfile
 2 #!/bin/bash
 3 echo the "\$*" is  $*
 4 echo the "\$@" is $@
 5 echo the "\$#" is $#
 6 echo the "\${!#}" is ${!#}
 7 
 8 [Hermioner@localhost Documents]$ bash testfile a b c d
 9 the $* is a b c d
10 the $@ is a b c d
11 the $# is 4
12 the ${!#} is d
View Code
 1 [Hermioner@localhost Documents]$ cat testfile
 2 #!/bin/bash
 3 echo
 4 count=1
 5 for param in "$*"
 6 do 
 7    echo "\$* Parameter #$count = $param"
 8    count=$[ $count+1 ]
 9 done
10 
11 echo
12 count=1
13 for param in "$@"
14 do
15    echo "\$@ Parameter #$count = $param"
16    count=$[ $count+1 ]
17 done
18 
19 [Hermioner@localhost Documents]$ bash testfile a b c d
20 
21 $* Parameter #1 = a b c d
22 
23 $@ Parameter #1 = a
24 $@ Parameter #2 = b
25 $@ Parameter #3 = c
26 $@ Parameter #4 = d
27 [Hermioner@localhost Documents]$ 
View Code

3. shift 移动变量  

     shift可以用来在不知道有多少参数,以及每个参数的值的情况下进行遍历,因为它始终可以只打印第一个值。默认情况下它会将每个参数变量向左移动一个位置。所以变量$3的值会移动到$2中,$2的值会移动到$1中,而变量$1的值则会被删除(note:$0代表程序吗,不会改变)

     也可以shift n 来指定左移动多少个,eg: shift 2   ,则$3的会移动到$1中,这样就可以跳过一些值不遍历了。

1 [Hermioner@localhost Documents]$ cat test3.sh
2 #!/bin/bash
3 echo "the original parameters is $*"
4 shift 2
5 echo "the new first parameter is $1"
6 [Hermioner@localhost Documents]$ bash test3.sh 1 2 3 4 5
7 the original parameters is 1 2 3 4 5
8 the new first parameter is 3
9 [Hermioner@localhost Documents]$
View Code

     note:配合shift的使用,同样可以通过shell脚本中的逻辑来判断是选项还是参数,从而让参数得到应有的输出。并在在bash shell中还提供了getopt和getopts来判断是选项还是参数-------用时参考它们用法即可。

4. 获取用户输入-------交互性更强,类似java中的scanner+system.in用法

    采用read命令。read后面跟变量名,就可以将输入的值保存到变量中;如果不输入变量名,那么就自动保存在了特殊环境变量REPLY中。

1 [Hermioner@localhost Documents]$ cat test1
2 #!bin/bash
3 echo -n "Enter your name:"
4 read name
5 echo "hello $name"
6 [Hermioner@localhost Documents]$ bash test1
7 Enter your name:Tom
8 hello Tom
9 [Hermioner@localhost Documents]$ 
View Code

      note1:如果用户一直不输入,read会一直等待,因此可以设置计时器,用-t选项。时间过了,就不等了。

      eg:read -t 5 name

      note2: 类似密码输入,隐藏方式读取,只需要添加 -s就可以

      note3: 还可以从文件中读取,一行一行的读取

 1 [Hermioner@localhost Documents]$ cat test1
 2 #!bin/bash
 3 a
 4 b
 5 c
 6 [Hermioner@localhost Documents]$ cat test2
 7 #!/bin/bash
 8 cat test1 | while read line    #采用了管道
 9 do
10     echo "the line is $line"
11 done
12 echo "read is done"
13 [Hermioner@localhost Documents]$ bash test2
14 the line is #!bin/bash
15 the line is a
16 the line is b
17 the line is c
18 read is done
19 [Hermioner@localhost Documents]$ 
View Code

补充管道:

     command1 | command2   就是将命令1的输出重定向到了command2中。 可以多级重定向,多添加|就好了。

 

参考文献

Linux命令行与shell脚本编程大全(第3版)[美] 布鲁姆(Richard Blum),布雷斯纳汉(Christine Bresnahan) 著,门佳,武海峰 译

 

转载于:https://www.cnblogs.com/Hermioner/p/9383629.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV 2.4.0 正式版发布,开源计算机视觉库

OpenCV 于近日发布了 2.4.0 正式版。 OpenCV是一个基于BSD许可证授权发行的跨平台开源计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。作为一款简洁而且高效的视觉库,OpenCV由一系列 C 函数和少量 C 类构成,同时提供了Python、Ru…

最小编辑代价-golang

题目: 给定两个字符串str1和str2,在给定三个整数ic,dc和rc,分别代表插入、删除和替换一个 字符,返回将str1编辑成str2的最小代价。 解题方法: 动态规划。首先生成大小为(M1)X(N1)的矩阵dp。 假设str1"avb12cd3", str2&q…

You can't specify target table 'TS_AUTH_ADMIN' for update in FROM clause记录

1. 报错:You cant specify target table TS_AUTH_ADMIN for update in FROM clause, 百度查到说是,不能在同一语句中先select出同一表中的某些值,再update这个表 。 我原本的sql是:(删除角色的时候&#…

study of javaserver faces lifecycle

JavaServer Faces应用程序的生命周期在客户端为页面发出HTTP请求时开始,并在服务器响应该页面并转换为HTML时结束。 通常将JSF的生命周期分为两个阶段: #执行阶段 #渲染阶段 1.执行阶段 JavaServer Faces应用程序生命周期执行阶段包含以下子阶段&#xf…

sql语句update中多个case/when的写法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 又如: update xxxx_xxxx set xxx_typeCASE WHEN xxx_type 0 THENYXLX-0WHEN xxx_type 1 THENYXLX-1WHEN xxx_type 2 THE…

警惕开源代码库中的安全隐患

最近的一项研究发现, 在调查的31个流行库(框架)的1261个版本中,超过三分之一存在已知的安全漏洞,大约四分之一的下载文件已经被污染。 该项研究由Aspect Security和Sonatype发起。Aspect Security是一家评估软件安全漏…

线程间的协作(3)——管道输入/输出流

2019独角兽企业重金招聘Python工程师标准>>> 1.管道输入/输出流类 分为两类,字节流管道类(PipedInputStream/PipedOutputStream)和字符流管道类(PipedReader/ PipedWriter)。这两个IO流实现了可以在不同的任…

windows简易版本 Redis 使用 demo样例(ssm框架下)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 在网上下载 windows 版本 的Redis 。下载了直接解压出来 : 2. 双击 redis-server.exe 启动服务(如下图&#…

程序员的半衰期只有15年?

曾在Google工作负责过技术工作的科技编辑 Matt Heusser总结了他在Google的生活经历,得出结论: 作为程序员,你只有15年时间。Matt 写道当我在Google工作时,发现Google大部分人都是20出头的年轻人,他们经历的很多事情都是…

EasyNVR、EasyDSS二次开发之:RTMP、HLS流在web页面进行无插件播放示例Demo代码

不管是基于EasyNVR还是EasyDSS,都是支持无插件直播,这也是未来视频直播的一个趋势。对于传统的浏览器插件播放谁用谁知道; 以上是软件自带播放展示 背景需求 对于EasyNVR和EasyDSS的使用方式大概分为两大类,一类是直接将软件作为视…

11--移除重复节点

编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。 示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3] 示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, 2]

信息图:程序员/开发人员实际在用哪些工具

BestVendor.com的工作人员在全球范围内采访了500名重要开发人员,在调查询问他们实际使用的工具后,制作了一张信息图,如下。 这张信息图覆盖10个方面的工具:Bug 追踪、数据库、开发框架、集成开发环境(IDE)、…

12-- 缺失的第一个正数

文章目录1.问题描述2.解题代码1.问题描述 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11,12] 输出: 1 提示: 你的算法的时间复杂度应…

java中的private public protected

1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用 2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵…

7款最流行的在线项目管理工具推荐

本文介绍一些非常流行的在线项目管理工具,希望你喜欢。 1. Apptivo 如果你是一个创业的或自由开发人员,或者属于一个小型专业团队,Apptivo这个项目管理软件很值得你你研究。实质上,它是一个基于Web的项目管理应用,让你…

VR全景看年评!PConline年度评测盛典等你来体验

【PConline 2016年度评测】又是一年春草绿,马上还有十天扒拉月2016年就快过完了。每年到这个时候,我们不禁都会拷问自己:你存到钱了么?娶到媳妇了么?买到房了么?答案是都没有!哈哈,这…

swagger详解

1快速环境搭建 pom.xml文件中添加如下内容(看清楚再复制&#xff0c;此处不是全部内容) 1 <properties>2 ...3 <swagger.version>2.2.2</swagger.version>4 ...5 </properties>6 7 <dependency>8 …

13--长度最小的子数组

文章目录1.题目要求2.解题代码1.题目要求 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的连续子数组&#xff0c;并返回其长度。如果不存在符合条件的连续子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;…

Apache Subversion 1.7.2发布,开源版本控制工具

SVN&#xff08;Subversion&#xff09;已经发布了1.7的第二个维护版本。 Apache Subversion是一个开放源码、多用户的版本控制系统&#xff0c;支持非 ASCII 文本和二进制数据&#xff0c;支持可在本地访问或通过网络访问的数据库和文件系统存储库。相对于传统的RCS、CVS&…