shell 脚本处理用户输入
一、命令行参数
向shell脚本中传递数据的最基本方式就是命令行参数。允许在运行脚本时向命令添加数据。如:
zzz@ubuntu:~/my_learning$ ./test_cmd 10 20
读取位置参数
bash shell 会将一些称为位置参数的特殊变量分配给输入到命令行中的所有参数。位置参数变量是标准的数字:$0是程序名,$1是第一个参数,$2是第二个参数,以此类推。
如果 shell 脚本中使用命令行参数,但执行时未提供参数,会出现问题。所以在使用参数前一定要检查其中是否存在数据。
zzz@ubuntu:~/my_learning$ cat test.sh
#!/bin/bash
echo "File name is $0"
if [ -n "$1" ]
then
echo "The $1 is $1"
else
echo "$1 未提供."
fi
zzz@ubuntu:~/my_learning$ ./test.sh 10
File name is ./test.sh
The $1 is 10
zzz@ubuntu:~/my_learning$ ./test.sh
File name is ./test.sh
$1 未提供.
zzz@ubuntu:~/my_learning$
- $# : 含有脚本运行时携带的命令行参数的个数。
- $* : 将命令行上提供的所有参数当作一个单词保持。这个单词包含了命令行中出现的每一个参数值。
- $@: 将命令行上提供的所有参数作为一个字符串上多个独立的单词,可用于遍历所有的参数值。
zzz@ubuntu:~/my_learning$ cat test.sh
#!/bin/bash
echo "$0 参数个数:$#"
echo "$* 遍历输出:"
for val in "$*"
do
echo "$val"
done
echo "$@ 遍历输出:"
for val in "$@"
do
echo "$val"
done
zzz@ubuntu:~/my_learning$ ./test.sh 10 20
./test.sh 参数个数:2
$* 遍历输出:
10 20
$@ 遍历输出:
10
20
zzz@ubuntu:~/my_learning$
shift 移动变量
shift 命令可以移动操作命令行参数: $3的值赋值给$2,$2的值赋值给$1,$1的值删除。
count=1
while [ -n $1 ]
do
echo "Parameter$count is $1"
count=$[ $count + 1 ]
shift
done
二、命令行选项和参数
命令行的选项是指,在执行命令时同时提供的单破折号后面的单字母,能改变命令的行为。
getopts 命令内建于bash shell。getopts 命令的格式如下:
getopts optstring variable
有效的字母都会列在 optstring 中,如果选项字母要求有参数值,就在字母后加 “:” 。如果命令行提供了 optstring 中没有的参数,将会输出错误信息,可以在 optstring 前添加 “:” 来去掉错误信息。
getopts 会将当前参数保存在 variable 中。getopts 命令会用到两个环境变量。如果选项需要跟一个参数值,参数值将保存在OPTARG环境变量。OPTIND环境变量保存了参数列表中 getopts 正在处理的参数位置,这样可以在处理完选项之后继续处理其它命令行参数。
zzz@ubuntu:~/my_learning$ cat test.sh
#!/bin/bash
echo
while getopts :ab:c opt
do
case "$opt" in
a) echo "deal -a option";;
b) echo "deal -b option, with value $OPTARG";;
c) echo "deal -c option";;
*) echo "Unknow option";;
esac
done
zzz@ubuntu:~/my_learning$ ./test.sh -ab b_value -c
deal -a option
deal -b option, with value b_value
deal -c option
zzz@ubuntu:~/my_learning$
三、获得用户输入
基本的读取用户输入
read 命令从标准输入或另一个文件描述符中接受输入。在收到输入后,read命令会将数据放进一个变量。
read -p 提示信息
read -t 指定一个计时器,指定等待输入的秒数,到期后,返回一个非零退出状态码
read -s 在显示器上不显示输入
zzz@ubuntu:~/my_learning$ cat test1.sh
#!/bin/bash
read -p "输入一个字符串: " str
echo "str is $str"
zzz@ubuntu:~/my_learning$ ./test1.sh
输入一个字符串: zz
str is zz
zzz@ubuntu:~/my_learning$
zzz@ubuntu:~/my_learning$ cat test1.sh
#!/bin/bash
read -p "输入一个名字: " first last
echo "Name is $first$last"
zzz@ubuntu:~/my_learning$ ./test1.sh
输入一个名字: z zz
Name is zzz
zzz@ubuntu:~/my_learning$
如果在 read 命令行中不指定变量。read 命令将会把接受到的所有数据都放进特殊环境变量 REPLY 中。
zzz@ubuntu:~/my_learning$ cat test1.sh
#!/bin/bash
read -p "输入一个名字: "
echo "Name is $REPLY"
zzz@ubuntu:~/my_learning$ ./test1.sh
输入一个名字: z zz
Name is z zz
zzz@ubuntu:~/my_learning$
四、从文件中读取
read 命令也可以读取 Linux 文件中保存的数据。每次调用 read 命令,都会从文件中读取一行文本,当文件中没有内容时,read 退出并返回非零退出状态码。
zzz@ubuntu:~/my_learning$ cat files
This is Line1.
This is Line2.
This is Line3.
This is Line4.
zzz@ubuntu:~/my_learning$ cat test2.sh
#!/bin/bash
cat files | while read line
do
echo "Read: '$line'"
done
echo "Read Finished."
zzz@ubuntu:~/my_learning$ ./test2.sh
Read: 'This is Line1.'
Read: 'This is Line2.'
Read: 'This is Line3.'
Read: 'This is Line4.'
Read Finished.
zzz@ubuntu:~/my_learning$
原文地址:https://blog.csdn.net/weixin_43276033/article/details/124723106
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_41742.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!