九、处理用户输入

简单目录

  • 1.命令行参数
  • 2.处理命令行选项和命令行参数参数
  • 3.read命令获取用户输入

1.命令行参数

在命令行直接执行脚本都会,同样的,在执行脚本的同时可以带参数

读取参数

看下面的脚本例子

#!/bin/bash
  
echo $0
echo $1
echo $2

运行结果

➜  ./test 1 2
./test
1
2

bash shell会用一些特殊变量接收这些参数,$0脚本名、1第一个参数以此类推,一直到$9
*注意 $0是脚本的名字和路径
*注意 参数是以空格区分的,如果字符串中间有空格的话,可以用引号将字符串包裹起来(单双引号均可),如下

➜ ./test 1 "hello world"
./test
1
hello world

*注意 如果传递参数超过9个,超过的部分用花括号包裹起来即可,如下

${10}

*注意 如果想去掉$0中的路径,可以用basename命令,如下

$(basename $0)

*注意 如果脚本中用了变量,但是实际没有传参数,运行脚本时会报错
为了解决参数未传的问题,可以使用-n命令在脚本中对变量进行检测,如下

if [-n "$1"]
then
  .......

特殊参数变量

bash shell中提供了一些特殊的变量,帮助处理参数
$#命令行参数个数
$*将所有参数转换成一个词
$@将所有参数转换成一个字符串,将每一个参数当做一个词
shift命令获奖没测参数变量向左移动一个位置,即$3的值会移动到$2中,这样会方便我们便利参数
*注意 移动后,左面的值将被删除,不可找回
*注意 shift命令后可以接一个参数,表示移动多少位

2.处理命令行选项和命令行参数

命令行中不光可以传参数,还可以传命令行选项
通常的shell脚本会用--将选项和参数分割,这样,在脚本内部可以根据--区分

getopt命令格式化命令行参数,格式如下
getopt optstring parameters

optstring定义了那些字母是命令行选项,并且那些带参数(字母后跟冒号标识选项有参数)
parameters是参数
举例如下:

➜ getopt ab:cd -a -b test1 -cd test2 test3
 -a -b test1 -c -d -- test2 test3

格式化之后的参数通过--将选项与参数分开,并在适当的选项后加了参数
*注意 命令行中出现未定义的选项,getopt命令会报错,如果不想报错,可以加-q参数

getopts命令

getoptsgetopt的基础上增加了两个环境变量
OPTARG: 如果一个选项要跟一个参数,则OPTARG会保存这个值
例子

#!/bin/bash
echo 
while getopts :ab:c opt
do
                case "$opt" in
                        a) echo "选项a";;
                        b) echo "选项b, b选项带的参数$OPTARG";;
                        c) echo "选项c";;
                        *) echo "结束"
                esac
done

执行结果

➜  ./test -ab test1 -c
选项a
选项b, b选项带的参数test1
选项c

*注意 上面脚本中用到的optOPTARG变量

OPTIND:getopts每处理一个参数,OPTIND会增一,这样就可以知道参数的位置
例子:

#!/bin/bash
  
echo 
while getopts :ab:c opt
do
                case "$opt" in
                        a) echo "选项a";;
                        b) echo "选项b, b选项带的参数$OPTARG";;
                        c) echo "选项c";;
                        *) echo "结束"
                esac
done

shift $[$OPTIND - 1]

echo "下面的是参数"

count=1
for param in "$@"
do
        echo "参数$count: $param"
        count=$[$count-1]
done

运行结果

➜  ./test -ab test1 -c test2 test3

选项a
选项b, b选项带的参数test1
选项c
下面的是参数
参数1: test2
参数0: test3

*注意 linux中有一些约定俗成的选项标准,所以在写脚本的时候最好遵循这些标准

3.read命令获取用户输入

read命令从标准输入接收

例子:

#!/bin/bash
  
echo -n "请输入你的名字:"
read name
echo "你好: $name"

执行结果:

➜   ./read
请输入你的名字:haha
你好: haha

-n选项不会在字符串末尾加上换行
-p选项可以直接在read命令后指定变量,上面的脚本可简写为

#!/bin/bash
  
read -p "请输入你的名字:" name
echo "你好: $name"

*注意 -p命令可以指定多个变量,输入时用空格区分
*注意 如果输入大于指定变量个数,则会依次分配,直到最后一个变量接收所有剩下的参数
*注意 如果-p命令没有指定变量,则默认输入会存储在REPLY变量中

-t选项可以指定一个定时器,指定read命令等待输入的秒数,如下

read -t 5 -p "请输入:" 

*注意 如果超出时间,则read命令会以非0状态码结束

-s选项可以隐藏输入,常见的有在命令行输入密码的时候

read命令从文件接收输入

read命令读取文件时,每执行一次read命令会读取文件中的一行文本,如果没有内容,则read命令会以非0状态码退出
例子:

#!/bin/bash
cat file | while read line
do
        echo "$line"
done

你可能感兴趣的:(九、处理用户输入)