简单目录
- 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
命令
getopts
在getopt
的基础上增加了两个环境变量
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
*注意 上面脚本中用到的opt
和OPTARG
变量
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
网友评论