Title here
Summary here
Positional Parameters,脚本的位置参数。
$0
:脚本名,包含路径。$1
:第一个参数,以此类推。${10}
:大于 9 的参数要用花括号。#!/usr/bin/env bash
echo $0
echo $1
./foo a
./foo
a
可以去掉脚本的路径,只保留名称。
basename /home/kuga/foo
脚本中的用法。
name=$(basename $0)
shift
命令可以把位置参数左移一位。
#!/usr/bin/env bash
i=1
while [ -n "$1" ]
do
echo "param #$i = $1"
i=$[ $i + 1 ]
shift
done
./foo a b
param #1 = a
param #2 = b
选项就是以在单个连字符后跟单个字母,如:-a
。由于选项和参数都是出现在脚本的后面,为了区分开来,一般是用双连字符 --
,左边是选项,右边是参数,例如。
./foo -a -b -- p1 p2
要在脚本中正确解释选项和参数,不是一件容量的事情,为此官方提供了两个工具。
getopt
--help
。getopts
Github 上也有不少选项解释项目。
getopt optstring parameters
optstring
:选项的定义。parameters
:选项的内容。例如对于 optstring=ab:c
。
a
和 c
代表无值选项。b
后跟 :
表示有值选项。看看下面例子的输出。
getopt ab:c -a -b bval -c p1 p2
-a -b bval -c -- p1 p2
可以看到他使用 --
把选项和参数分隔开了。
getopts
是 Bash 的内置命令,它会逐个解释选项,然后把选项的信息存储在特定变量中,方便脚本访问。这才是给我这种小菜鸡用的命令。
getopts optstring name
name
:当前选项的名称。OPTIND
:每处理一个项目,该值会加 1。OPTARG
:如果选项有值,会保存在这个变量中。#!/usr/bin/env bash
while getopts "ab:c:" name; do
case $name in
a)
echo "Option -a"
;;
b)
echo "Option -b: $OPTARG"
;;
c)
echo "Option -c: $OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG"
exit 1
;;
esac
done
# 显示 OPTIND 的值
echo "OPTIND: $OPTIND"
# 使用 shift 来移除已解析的选项和参数
shift $((OPTIND - 1))
# 剩余的非选项参数
echo "Params: $@"
./foo -a -b v1 -c v2 p1 p2
Option -a
Option -b: v1
Option -c: v2
OPTIND: 6
Params: p1 p2