shell基础05 处理用户输入

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

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

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

 1 [[email protected] 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 [[email protected] 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

1 [[email protected] Documents]$ cat test3
2 #!/bin/bash
3 echo the tenth parm is ${10}
4 echo the eleventh parm is ${11}
5 [[email protected] 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 [[email protected] Documents]$ 

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

2. $#,$*,[email protected],${!#}

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

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

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

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

 1 [[email protected] Documents]$ cat testfile
 2 #!/bin/bash
 3 echo the "\$*" is  $*
 4 echo the "\[email protected]" is [email protected]
 5 echo the "\$#" is $#
 6 echo the "\${!#}" is ${!#}
 7
 8 [[email protected] Documents]$ bash testfile a b c d
 9 the $* is a b c d
10 the [email protected] is a b c d
11 the $# is 4
12 the ${!#} is d

 1 [[email protected] 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 "[email protected]"
14 do
15    echo "\[email protected] Parameter #$count = $param"
16    count=$[ $count+1 ]
17 done
18
19 [[email protected] Documents]$ bash testfile a b c d
20
21 $* Parameter #1 = a b c d
22
23 [email protected] Parameter #1 = a
24 [email protected] Parameter #2 = b
25 [email protected] Parameter #3 = c
26 [email protected] Parameter #4 = d
27 [[email protected] Documents]$ 

3. shift 移动变量  

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

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

1 [[email protected] 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 [[email protected] 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 [[email protected] Documents]$

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

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

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

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

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

eg:read -t 5 name

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

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

 1 [[email protected] Documents]$ cat test1
 2 #!bin/bash
 3 a
 4 b
 5 c
 6 [[email protected] 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 [[email protected] 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 [[email protected] Documents]$ 

补充管道:

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

参考文献

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

原文地址:https://www.cnblogs.com/Hermioner/p/9383629.html

时间: 2024-08-04 10:04:35

shell基础05 处理用户输入的相关文章

shell脚本,提示用户输入一个用户名,如果存在;显示用户UID和SHELL信息;否则,则显示无此用户;显示完成之后,提示用户再次输入;如果是quit则退出;

[[email protected] wyb]# cat tishiuser.sh #!/bin/bash #提示用户输入一个用户名,如果存在:显示用户UID和SHELL信息:否则, #则显示无此用户:显示完成之后,提示用户再次输入:如果是quit则退出; echo 'Input `quit` to quit' while : do read -p "Please Input a user:" choice [ -z $choice ] &&continue [[ &q

Shell函数、接受用户输入

1.调用Shell函数: Shell函数的调用和c语言的函数调用有所区别,其参数跟在函数名后,不需要用括号括起来. 执行结果: 2.接受用户输入: read -p 原文地址:https://www.cnblogs.com/zhai1997/p/12092316.html

Shell基础--read接受键盘输入

read [选项] [变量名]-选项 -p "提示信息":在等待read输入时,输出提示信息-t 秒 :read命令一直在等待用户输入,指定等待时间,超时则结束当前等待输入-n 字符数:read命令只接受指定的字符数量,达到数量立即执行-s 隐藏域,用于机密信息的输入,如密码 实例 #!/bin/bash read -p "请输入用户名" -t 20 username echo -e "\n" read -p "请输入密码"

Shell编程中的用户输入处理

Linux read命令用于从标准输入读取数值. read 内部命令被用来从标准输入读取单行数据.这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据. 语法 read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] 参数说明: -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符.

四则运算实现用户输入答案并统计正确数量

一,设计思路: 本次的实现目标是在上次代码的基础之上实现用户输入答案,并判断答案是否正确并进行统计,最后输出正确答案的个数. 判断答案是否正确的思路是在上次的基础之上先定义wrong(用来统计错误个数)right(用来统计正确的个数)k1,参数. 在void Display函数中定义答案的判断和正确错误的统计,最后在主函数中通过指针的调用来实现答案正确和错误个数的统计. 二,源代码: #include<stdlib.h>#include<iostream.h>#include<

shell基础:使用read、命令行脚本传参实现输入2个整数并计算

shell基础练习题:使用read交互输入,命令行脚本传参2种方式,实现输入2个整数数字,并计算加减乘除.考察shell基础知识包括:变量定义.read.if判断语句.正则表达式等知识: 第一种方式:read交互输入参数 思路为:判断输入的第2个变量是否为空,为空则提示输入2个数字:不为空则判断输入的是否为整数,用到expr,作用为让2个变量进行相加,如果结果为0说明输入2个为数字,如结果非0则说明输入非整数,提示输入的不是非整数: #!/bin/bash read -p "pls input 

shell整理(29)===判断用户输入可不可以作为变量

(一)题目: 接受一个用户输入,判断这个输入是否可以作为变量 可以作为变量的条件 (1)大小写字母都可以 (2)字母中间可以有数字,但是不能以数字开头 (3)特殊字符除了"_ "其他都不可以作为变量 例如: [[email protected] hushuai]# bash 22.sh Input:1dsf Name is not [[email protected] hushuai]# bash 22.sh Input:=ewr Name is not [[email protect

Linux Shell用户输入--整理

在shell脚本中处理linux输入主要有三种形式: 1)将他们像命令行参数一样处理,通过对应的位置参数来获取对应的输入参数 2)通过getopt和getopts这两个命令 3)通过read命令以交互的方式获取用户的输入参数 1.通过对应的位置参数获取 shell中的位置参数的计算是从0开始的依次往后加1对应用户的输入参数:例如$0对应的是用户的程序名,$1对应的第一个参数,$2为第二个参数,依次类推直到第10个参数以后则应用花括号将对应的位置参数包裹的获取方式为${10}. $#,$*,[em

Shell 读取用户输入

14.2  读取用户输入 14.2.1  变量 上一章我们谈到如何定义或取消变量,变量可被设置为当前shell的局部变量,或是环境变量.如果您的shell脚本不需要调用其他脚本,其中的变量通常设置为脚本内的局部变量(参见第13.10节"变量"). 要获取变量的值,在美元符后跟变量名即可.shell会对双引号内的美元符后的变量执行变量扩展,单引号中的美元符则不会被执行变量扩展. 范例14-3 1   name="John Doe" or declare name=&q