shell脚本(四)处理用户输入

编写的脚本需要能够与使用者进行交互。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"

你可能感兴趣的:(Linux,linux,bash,运维)