# Shell 传递参数
## 方式一:$数字
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:**$n**。**n** 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
以下实例我们向脚本传递三个参数,并分别输出,其中 **$0** 为执行的文件名(包含文件路径)
```shell
#!/bin/bash
# wangyuedong
echo "shell传递参数>>>";
echo "执行的文件名: $0";
echo "第一个参数: $1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
```
为脚本设置可执行权限,并执行脚本,输出结果如下所示
```bash
chmod +x wang.sh
./wang.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./wang.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
```
优点:获取参数相对较为容易。
缺点:必须按照特定的顺序输入参数,漏写了参数就会出现参数对应的错误。
## 方式二:getopts
语法格式
```bash
getopts [option[:]] [Description] variable
option: 表示脚本可以使用的选项。
":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)
variable:表示将某个选项保存在变量variable中
```
实例
```shell
while getopts ":a:b:c" opt
do
case ${opt} in
a) echo "参数a的值$OPTARG"
;;
b) echo "参数b的值$OPTARG"
;;
c) echo "参数c的值$OPTARG"
;;
?) echo "未知参数"
exit 1;;
esac
done
```
用一个while循环加case分支获取不同参数,`:a:b:c`相当于定义参数的变量名,有时候可能会有未知参数,所以增加一个?的分支。shell中按下述方式执行脚本。
```bash
./test.sh -a 1 -b 2 -c 3
```
优点:由于使用了-a加参数值的方式进行一一匹配,所以不会参数匹配错误,同时也可以缺省参数,并不会导致参数错误,同时也便于后期参数的扩展和移植。
缺点:脚本执行时参数需要的输入会增多。
getopts方式只可以使用单个字母作为变量名