一站式搞定Bash脚本的参数处理问题

时间:2020-12-15 08:35:40   收藏:0   阅读:33

以下是来自StackOverflow网站的答案中的代码,写的实在是太好了,引用在这里,以供查阅。


第一段代码,这个例子展示了如何解析处理以空格分隔的参数(例如:–-option argument 这样的传参方式),不使用getopt和getopts函数来实现。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/bash

# Usage: /tmp/demo-space-separated.sh -e conf -s /etc -l /usr/lib /etc/hosts

POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
    -e|--extension)
    EXTENSION="$2"
    shift # past argument
    shift # past value
    ;;
    -s|--searchpath)
    SEARCHPATH="$2"
    shift # past argument
    shift # past value
    ;;
    -l|--lib)
    LIBPATH="$2"
    shift # past argument
    shift # past value
    ;;
    --default)
    DEFAULT=YES
    shift # past argument
    ;;
    *)    # unknown option
    POSITIONAL+=("$1") # save it in an array for later
    shift # past argument
    ;;
esac
done

set -- "${POSITIONAL[@]}" # restore positional parameters

echo "FILE EXTENSION  = ${EXTENSION}"
echo "SEARCH PATH     = ${SEARCHPATH}"
echo "LIBRARY PATH    = ${LIBPATH}"
echo "DEFAULT         = ${DEFAULT}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
    echo "Last line of file specified as non-opt/last argument:"
    tail -1 "$1"
fi

一些说明:


第二段代码,这个例子展示了如何门解析处理以等号分隔的参数(例如:–-option=argument 这样的传参方式),不使用getopt和getopts函数实现。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash

# Usage: /tmp/demo-equals-separated.sh -e=conf -s=/etc -l=/usr/lib /etc/hosts

for i in "$@"
do
case $i in
    -e=*|--extension=*)
    EXTENSION="${i#*=}"
    shift # past argument=value
    ;;
    -s=*|--searchpath=*)
    SEARCHPATH="${i#*=}"
    shift # past argument=value
    ;;
    -l=*|--lib=*)
    LIBPATH="${i#*=}"
    shift # past argument=value
    ;;
    --default)
    DEFAULT=YES
    shift # past argument with no value
    ;;
    *)
          # unknown option
    ;;
esac
done
echo "FILE EXTENSION  = ${EXTENSION}"
echo "SEARCH PATH     = ${SEARCHPATH}"
echo "LIBRARY PATH    = ${LIBPATH}"
echo "DEFAULT         = ${DEFAULT}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
    echo "Last line of file specified as non-opt/last argument:"
    tail -1 $1
fi

一些说明:

  • ${i#*=}  --- 这里的语义通过上下文能看出来是移除了“-e=conf”这样一个字符串里的值为“-e=”的子字符串。简单的语法是${string#substring},即从string的前头开始,删除最短的substring的一个匹配,详情看这里的“Substring Removal”的部分。这个语句中的*是一个通配符(wildcard),*=的意思是任意字符直到遇到等号的子字符串。关于删除子字符串,这里给出了一个删除前缀和后缀的例子。


第三段代码,使用getopts函数实现。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/sh

# Usage: /tmp/demo-getopts.sh -vf /etc/hosts foo bar

# A POSIX variable
# Reset in case getopts has been used previously in the shell.
OPTIND=1         

# Initialize our own variables:
output_file=""
verbose=0

while getopts "h?vf:" opt; do
    case "$opt" in
    h|\?)
        show_help
        exit 0
        ;;
    v)  verbose=1
        ;;
    f)  output_file=$OPTARG
        ;;
    esac
done

shift $((OPTIND-1))

[ "${1:-}" = "--" ] && shift

echo "verbose=$verbose, output_file=‘$output_file‘, Leftovers: $@"

一些说明:

对于这个使用getopts的实现方法:


https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash

原文:https://www.cnblogs.com/awpatp/p/14136500.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!