第11章 处理用户输入

喜夏-厌秋 提交于 2020-03-07 16:18:45

11.1 命令行参数

可以在执行脚本时,向命令行中添加数据值

如   ./add.sh    10  30  

11.1.1  读取参数

命令行中输入的所有参数赋值给一些特殊变量,这些变量称为  位置变量

$0  为程序名称

$1  为第一个参数名称,以此类推,超过10 用 ${10}  表示

注意点:

每个参数都是使用空格分隔,要想在参数中包含空格,就必须使用 ‘ ’  或者“ ”

引号不作为数据的一部分,他们只定义数据的起止 

11.1.2  读取程序名称

使用 参数 $0 可以确定从命令行启动的程序的名称。实际上 $0 是程序的完整路径,

而不是程序名称,basename 只返回程序名称,不带路径

name=`basename  $0`

echo the command entered is :$name

11.2  特殊参数变量

有一些特殊的变量用来跟踪命令行参数

11.2.1 参数计数

$#   命令行参数的个数

${!#}  命令行最后一个参数

当命令行没有参数时,$#   值为0    ${!#} 返回脚本名称

获取命令行所有参数  $*   $@

$*      将命令行中所有参数作为一个单词处理

$@    作为一个字符串中的多个单词处理

11.3  移位---改变命令行参数的相对位置

使用shift 命令,默认每个参数变量左移一个位置,于是,$2的值移交给$1, $1的值丢弃,变量

$0 的值和程序名称都保持不变

在不清楚 参数数目的情况下,可以先对第一个参数进行操作,然后对参数进行一次左移,又对第一个

参数进行操作

count=1

while  [ -n  "$1"  ]

do

     echo "para  #$count=$1  "

    count=$[ $count+1 ]

    shift

done

11.4  处理选项

1.处理简单选项

while  [ -n "$1"  ]

do

    case "$1" in  

          -a)   echo "find  the  -a  option"   

         -b)   echo "find  the  -a  option"   

         -c)   echo "find  the  -a  option"   

         *)    echo  "$1  is  not  a  option"

    esac

    shift

done

./test15    -a   -b  -c  -d  

2.  从选项中分离参数

命令行参数 既有  选项 又  有参数  时 ,使用 -- 分割,-- 代表选项列表的结束

while [ -n  "$1"  ]

do

    case  "$1" in

        -a)  echo "find  -a  option";;

        -b)  echo "find  -a  option";;

        -c)  echo "find  -a  option";;

        --)  shift   

              break;;

        *)   echo "default   option";;

    esac

    shift

done

count=1

for  para  in  $@

do

     echo "para  is  #$count=$para"

    count=$[  count +1 ]

done

./test16   -a -b -c -- test1  test2

3. 处理带值得选项

while [ -n  "$1"  ]

do

    case  "$1" in

        -a)  echo "find  -a  option"  ;;

        -b)  para=$2

               echo " find the  -b option  ,with para value  $para    "

               shift 2;;

        -c)  echo "find  -a  option"    ;;

        --)  shift   

              break;;

        *)   echo "default   option";;

    esac

    shift

done

count=1

for  para  in  $@

do

     echo "para  is  #$count=$para"

    count=$[  count +1 ]

done

./test17  -a  -b  test   -c  --  mytest1  mytest2

11.6  获取用户输入

11.6.1  基本读取

read  命令接受键盘标准输入  ,并将数据放在一个标准变量中,

  echo  -n "entry  your  name: "

  read name

  其中  echo  -n  抑制字符串结尾的换行符,允许在字符串后面立即输入数据,而不是在下一行中输入

 read  -p  name    允许在read  命令中直接指定 变量

 read  命令行中如果不指定变量 ,接受数据会放到 环境变量  REPLY  中

-t  选项 指定read 命令等待输入的秒数  

if  read  -t 5  -p  "please  enter  your name  " name  (当计时器满时,read 命令 返回一个非0 退出状态 )

then

       echo "hello  $name"

else

       echo "too  slow"

fi

-n   read 命令接受字符的个数

read  -n1    (只接受一个字符)

-s  将读取的字符隐藏,不在屏幕显示比如密码

11.6.2  读取文件

每调用一次read 命令,读取文件中的一行,当没有可读行时,read  以非0状态退出

count=1

cat  test  | while read line

do

      echo  "line  $count : $line     "

      count=$[ count +1  ]

done

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!