Linux&shell之处理用户输入-阿里云开发者社区

开发者社区> 桃子红了呐> 正文

Linux&shell之处理用户输入

简介:
+关注继续查看

写在前面:案例、常用、归类、解释说明。(By Jim)

 命令行参数
11为第一个参数,2为第二个参数,依次类推...
示例:

复制代码
#!/bin/bash
# using one command line parameter

factorial=1
for((number = 1;number<=$1;number++))
do
  factorial=$[ $factorial*$number ]
done
echo The factorial of $1 is $factorial
复制代码

调用
./test1 5
(这样就把参数传递进去了)
结果:
The factorial of 5 is 120

复制代码
#!/bin/bash
# testing parameters before use

if [ -n "$1" ]
then
  echo Hello $1,glad to meet you.
else
  echo "Sorry,you didn't identify yourself."
fi
复制代码

(最好能验证一下是否有参数传入,这样最安全了,编程时也要这样处理)


获取所有数据
$* 所有参数作为一个单词处理
$@ 所有参数作为多个单词处理
$# 最后一个参数

复制代码
#!/bin/bash
# testing $* and $@

echo "Using the \$* method:$*"
echo "Using the \$@ method:$@"

./test1 rich jessica tom
复制代码

结果:
Using the method:richjessicatomUsingthe∗method:richjessicatomUsingthe@ method:rich jessica tom

貌似没差别,不过我们来看一个例子,就知道差别了

复制代码
#!/bin/bash
# testing $* and $@

count=1
for param in "$*"
do
  echo "\$* Parameter #$count = $param"
  count=$[ $count + 1 ]
done

count=1
for param in "$@"
do
  echo "\$@ Parameter #$count = $param"
  count=$[ $count + 1 ]
done
复制代码

测试:test1 1 2 3 4 5
结果:
* Parameter #1 = 1 2 3 4 5* Parameter #1 = 1 2 3 4 5@ Parameter #1 = 1
@ Parameter #2 = 2@ Parameter #2 = 2@ Parameter #3 = 3
@ Parameter #4 = 4@ Parameter #4 = 4@ Parameter #5 = 5
(由结果就能看出差别了)

移位
shift将参数变量左移一个位置,于是,变量33的值就移给变量2,变量22的值移给变量1,变量$1的值被丢弃。

复制代码
#!/bin/bash
# demonstrating the shift command

count=1
while [ -n "$1" ]
do
  echo "Parameter #$count = $1"
  count=$[ $count +1 ]
  shift
done
复制代码

执行:
test1 1 2 3 4 5
结果:
Parameter #1 = 1
Parameter #2 = 2
Parameter #3 = 3
Parameter #4 = 4
Parameter #5 = 5
(每次向前移一位,最后被置空了)

shift 2表示移动两位

处理选项

复制代码
#!/bin/bash
# extracting options and parameters

while [ -n "$1" ]
do
  case "$1" in
  -a) echo "Found the -a option" ;;
  -b) echo "Found the -b option" ;;
  -c) echo "Found the -c option" ;;
  --) shift
      break;;
  *)  echo "$1 is not an option" ;;
  esac
  shift
done

count=1
for param in $@
do
  echo "Parameter #$count:$param"
  count=$[ $count + 1 ]
done
复制代码

测试:
test1 -a -b -c test1 test2 -c
结果:
Found the -a option
Found the -b option
Found the -c option
test1 is not an option
test2 is not an option
Found the -c option
(每一个参数都遍历一次)

测试2:test1 -a -b -c -- test1 test2 -a
结果:
Found the -a option
Found the -b option
Found the -c option
Parameter #1:test1
Parameter #2:test2
Parameter #3:-a
(跳出循环,并将剩余的参数存入$@中去,供下面的代码使用,即便有-a出现也不会被发现了)

使用getopt命令
getopt -q ab:cd -a -b -test1  -cde test2 test3
(表示有a,b,c,d,其中b后面跟一个参数)
解析的结果为
 -a -b '-test1' -c -d -- 'test2' 'test3'

 getopt -q ab:cd -a -b -test1  -d -c -cd test2 -c test3
 解析结果为
 -a -b '-test1' -d -c -c -d -c -- 'test2' 'test3'
 (由此可以看出,它会将所有的选项与参数分离,按照一定的顺序,之间会自动加上--)

 来看一段完整的代码

复制代码
 #!/bin/bash
# extracting options and parameters
set -- `getopt -q ab:c "$@"`
while [ -n "$1" ]
do
  case "$1" in
  -a) echo "Found the -a option" ;;
  -b) param="$2"
      echo "Found the -b option,with parameter value $param"
      shift;;
  -c) echo "Found the -c option" ;;
  --) shift
      break;;
  *)  echo "$1 is not an option" ;;
  esac
  shift
done

count=1
for param in $@
do
  echo "Parameter #$count:$param"
  count=$[ $count + 1 ]
done
复制代码

测试:test1 -a -b test1 -cd test2 test3
结果:
Found the -a option
Found the -b option,with parameter value 'test1'
Found the -c option
Parameter #1:'test2'
Parameter #2:'test3'
(可以想象它就是按照解析的数据进行处理的)

getopts和它的堂兄弟getopt很相像。
案例:

复制代码
#!/bin/bash
# simple demonstration of the getopts command

while getopts :ab:c opt
do
  case "$opt" in
  a) echo "Found the -a option" ;;
  b) echo "Found the -b option,with parameter value $OPTARG";;
  c) echo "Found the -c option" ;;
  *) echo "Unknown option:$opt" ;;
  esac
done
复制代码

(它会自动处理移位,自动处理参数到变量$OPTARG,自动处理)
测试:
test1 -ab test1 -c -d
结果:
Found the -a option
Found the -b option,with parameter value test1
Found the -c option
Unknown option:?

getopts命令每个处理选项,环境变量OPTIND的值会加1,。当到达getopts处理的末尾时,可以使用shift命令
和OPTIND值进行操作来移动到参数。
看代码:

复制代码
#!/bin/bash
# simple demonstration of the getopts command

while getopts :ab:cd opt
do
  case "$opt" in
  a) echo "Found the -a option" ;;
  b) echo "Found the -b option,with parameter value $OPTARG";;
  c) echo "Found the -c option" ;;
  d) echo "Found the -d option" ;;
  *) echo "Unknown option:$opt" ;;
  esac
done

shift $[ $OPTIND -1 ]

count=1
for param in "$@"
do
  echo "Parameter $count : $param"
  count=$[ $count+1 ]
done
复制代码

测试:test1 -a -b test1 -cd test2 test3
结果:

Found the -a option
Found the -b option,with parameter value test1
Found the -c option
Found the -d option
Parameter 1 : test2
Parameter 2 : test3

获取用户输入
基本读取
read命令接受标准输入,得到输入后,read命令将数据存放到一个标准变量中。
案例:

复制代码
#!/bin/bash
# testing read

echo "Enter your name:"
read name
echo "Welcome ,$name !"
复制代码

测试:
test1
Enter your name:
jim
Welcome ,jim !

#!/bin/bash
# testing read

echo -n "Enter your name:"
read name
echo "Welcome ,$name !"

测试:

[root@localhost shellscript]# test1
Enter your name:jim
Welcome ,jim !
(抑制后面新的字符出现,-n就不会换行了)

read有个-p命令,允许在read命令行中直接指定一个提示:

复制代码
#!/bin/bash
# testing read -p option

read -p "Please enter your age:" age
days=$[ $age * 360 ]
echo "That makes you over $days days old!"
复制代码

测试:
[root@localhost shellscript]# test1
Please enter your age:25
That makes you over 9000 days old!
(25是输入的)



本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/3232095.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ClusterId read in ZooKeeper is null 处理
ClusterId read in ZooKeeper is null. Re-running the program after fixing issue 1 will result in the following error in the log file ...
1952 0
linux 读取input输入设备demo
/******************************************************************* * linux 读取input输入设备demo * 说明: * 本文主要是解读以前同事写的input设备的一个demo程序。
756 0
【POI】使用POI处理xlsx的cell中的超链接 和 插入图片 和 设置打印区域
使用POI对xlsx中插入超链接和 插入图片   1 package com.it.poiTest; 2 3 import java.awt.image.BufferedImage; 4 import java.
2757 0
9.2.1、Libgdx的输入处理之轮询
(官网:www.libgdx.cn) 轮询是检测输入设备的当前状态,比如特定的按键按下,屏幕第一个手指的位置等等。这是一个快速简单的处理用户输入的方式,并且应用到很多的游戏中。
794 0
如何使用 GeoTrellis 和 React 构建地理处理应用程序
这篇博文是使用 GeoTrellis、Akka HTTP和 React 创建GIS处理的网页应用程序的指南。翻译自凯利·英尼斯 (Kelly Innes)的博客。
160 0
4269
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载