编写的脚本需要能够与使用者进行交互。base shell提供了一些不同的方法来从用户处获得数据,包括命令行参数、命令行选项以及直接从键盘读取输入的能力。
命令行参数
命令行参数是向shell脚本传递数据的最基本方法。如下向脚本传递10和20两个数值
./hello.sh 10 20
读取参数
base shell会将位置参数的特殊变量分配给输入到命令行的所有参数,位置参数第一位是程序名:$0。
依次是$1、$2等,一直到$9。
#!/bin/bash
#接收参数
echo "脚本名称:$0"
shellname=$(hostname $0)
echo "脚本名称:$shellname"
echo "第一位参数:$1"
echo "第二位参数:$2"
#校验参数是否存在,-n:检查字符串长度是否非0
if[ -n "$1" ] then
echo "参数存在"
else
echo "参数不存在"
fi
#打印命令行参数个数,$#
echo "命令行参数个数:$#"
#打印命令行参数的最后一个参数,${!#}
echo "最后一个参数为:${!#}"
#所有命令行参数:$*
echo "所有命令行参数:$*"
#所有命令行参数:$@ 。$@和$*一个是当成一整个字符串,一个是每个参数一个空间,相当于数组
for param in $@ do
echo "命令行参数:$param"
done
#通过shift命令移动变量处理参数。shift可以把后一位参数移到前一位,第一位$1的值会被删除,$0不可被移动
#也可以指定shift移动位数:shift 2
while[ -n "$1" ]
do
echo "变量的值为:$1"
shift
done
处理选项
选项是跟在单破折号后面的字母,它能改变命令的行为,比如ls命令,可以加入-l选项,使文件信息输出的更全面。
使用shift处理简单选项
#!/bin/bash
#处理选项,执行脚本时传入选项:./shell.sh -a -b -c
while [ -n "$1" ] do
case "$1" in
-a) echo "hello —a" ;;
-b) echo "hello -b" ;;
-c) echo "hello -c" ;;
*) echo "hello other -";;
esac
#使用shift命令移动选项参数
shift
done
分离选项和参数
选项和参数都是执行脚本时在脚本后用空格分开输入的值,所以要对选项和参数有所区分。Linux处理这个问题的官方标是用特殊字符(双破折号—)来将二者区分。shell会用双破折号来表明选项列表结束。
#!/bin/bash
#在脚本中区分选项和参数,传入时:./shell.sh -a -b -c — 10 20 30
#处理选项
while [ -n "$1" ] do
case "$1" in
-a) echo "this is -a" ;;
-b) echo "this is -b" ;;
-c) echo "this is -c" ;;
—) shift
break;;
*) echo "$1 is not an option";;
esac
shift
done
#处理参数
for param in $@
do
echo "param is $param"
done
处理带值的选项
有些选项会带上一些额外的值,带选项后面带值的时候,脚本需要可以正确处理
#!/bin/bash
#处理带值的选项,启动脚本:./shell.sh -a 10 -b 20 — 10 20 30
while [ -n "$1" ]
do
case "$1" in
-a) param="$2"
echo "-a param=$param"
shift;;
-b) paramb="$2"
echo "-b param=$paramb"
shift;;
—) shift
break;;
*) echo "$1 is not an option";;
esac
shift
done
for param in "$@"
do
echo "param is $param"
done
获取用户输入
想要在脚本运行时让用户输入内容,与用户交互可以使用read命令
#!/bin/bash
#read命令获取用户输入,-n可以让输入不换行
echo -n "请输入你的名字:"
read name
echo "hello,$name"
#read提供-n选项,可以在read命令行指定提示符
read -p "输入你的年龄" age
echo "age=$age"
#read命令行不指定变量,read命令会将收到的任何数据都放假特殊环境变量REPLY中
read -p "enter your sex"
echo "sex=$REPLY"
设置超时
如果不管用户是否有输入,脚本都需要继续执行,而不是一直苦苦等待用户输入,可以使用-t参数来指定一个等待时间,单位秒(s)。当过期后read命令会返回一个非0的退出状态码。
#!/bin/bash
if read -t 5 -p 'enter you name' name
then
echo "your name is $name"
else
echo "sorry, time out"
fi
设置字符长度
read命令可以预设输入字符的长度,当输入达到预设字符长度时就自动退出
#!/bin/bash
#通过-n预设字符串长度,设为1
read -n1 -p "enter y or n " a
echo "$a"
隐藏方式读取
输入密码时不想将输入打印在屏幕上,此时可以用-s选项
#!/bin/bash
read -s -p "enter your password" password
echo "password = $password"