-
$# 传递到脚本的参数个数。
-
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
-
$$ 脚本运行的当前进程ID号
-
$! 后台运行的最后一个进程的进程ID号
-
@ 与 @ 与 @与#相同,但是使用时加引号,并在引号中返回每个参数
-
$- 显示shell使用的当前选项,与set命令功能相同
-
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
变量 含义
8.$0 脚本名字 $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 KaTeX parse error: Expected 'EOF', got '#' at position 11: {10} 位置参数 #̲10 9.# 位置参数的个数 “ ∗ " 所 有 的 位 置 参 数 ( 作 为 单 个 字 符 串 ) ∗ " *" 所有的位置参数(作为单个字符串) * " ∗"所有的位置参数(作为单个字符串)∗"@” 所有的位置参数(每个都作为独立的字符串)
10.KaTeX parse error: Expected '}', got '#' at position 2: {#̲*} 传递到脚本中的命令行参数…{#@} 传递到脚本中的命令行参数的个数
12.$_ 之前命令的最后一个参数
使用shell处理的时候对参数的处理是个基本模块,所以今天找到一篇简单易懂的文章来进行参考,作为以后shell参数处理的模板,推荐使用getopts形式进行参数的处理。如果需要支持长选项可以使用getopt在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。
1、 手工处理方式
2、 getopts
3、 getopt
下面我们依次讨论这
1. getopts种处理方式。
应该说绝大多数脚本使用该函数就可以了,如果需要支持长选项以及可选参数,那么就需要使用getopt.
下面是getopt的一个例子
#!/bin/bash
#
# Copyright
#
# Brief:
# Arguments: None
#
set -e # set -o errexit
set -u # set -o nounset
set -o pipefail
function usage(){
echo """Usage:
$(basename $0) [option]...
Options:
-i|--section section name
-s|--start_date start_date_id yyyymmdd or yyyymm
-s|--end_date end_date_id yyyymmdd or yyyymm
-h|--help print help information
"""
}
function main(){
if [ $# -lt 6 ]; then
usage
exit
fi
# get arguments
GETOPT_ARGS=$(getopt -o i:s:e:h: --long section:,start_date:,end_date:,help -- "$@")
eval set -- "${GETOPT_ARGS}"
while [ -n "$1" ]; do
case "$1" in
-i|--section)
section_name=$2
echo $2
shift 2
;;
-s|--start_date)
start_date=$2
echo $2
shift 2
;;
-e|--end_date)
end_date=$2
echo $2
shift 2
;;
-h|--h|--help)
usage
shift 1
;;
--)
break
;;
*)
usage;
break
;;
esac
done
echo "/home/felix/Acg_detail_v1.1.py -i ${section_name} -s ${start_date} -e ${end_date}"
}
main "$@"
2.手工处理方式
在手工处理方式中,首先要知道几个变量,还是以上面的命令行为例:
$0 : ./test.sh,即命令本身,相当于C/C++中的argv[0]
$1 : -f,第一个参数.
$2 : config.conf
$3, $4 … :类推。
KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ 参数的个数,不包括命令本身,…#为4.
$@ :参数本身的列表,也不包括命令本身,如上例为 -f config.conf -v --prefix=/home
∗
:
和
* :和
∗:和@相同,但"
∗
"
和
"
*" 和 "
∗"和"@"(加引号)并不同,"
∗
"
将
所
有
的
参
数
解
释
成
一
个
字
符
串
,
而
"
*"将所有的参数解释成一个字符串,而"
∗"将所有的参数解释成一个字符串,而"@"是一个参数数组。如下例所示:
#!/bin/bash
for arg in "$*"
do
echo $arg
done
for arg in "$@"
do
echo $arg
done