使用随机位置和更可读的参数调用bash函数



为了演示这个问题,下面是一个简单的例子,我们如何在bash中调用一个函数,并且参数需要以固定的顺序传递:

sample.sh


#!/bin/bash
# function
service() {
local service="$1" price="$2" level="$3"
echo "The service: $service"
echo "The price: $price"
echo "The level: $level"

}

# function call
service "repair" "10" "high"

上面将输出:

The service: repair
The price: 10
The level: high

上述函数调用的问题是,我不能以随机顺序传递参数,但我可以在函数service()中创建getop以解决问题:

sample.sh

#!/bin/bash
# function
service() {
local service price level short_opts long_opts options
service=""
price=""
level=""
short_opts=""
long_opts="service:,price:,level:"
options=$(getopt -o "${short_opts}" --long "${long_opts}" -n "example" -- "$@")
eval set -- "${options}"
while true; do
case "${1}" in
--service)
service="${2}"
shift 2
;;
--price)
price="${2}"
shift 2
;;
--level)
level="${2}"
shift 2
;;
--)
shift
break
;;
*)
echo "Invalid option: ${1}"
exit 1
;;
esac
done
echo "The service: $service"
echo "The price: $price"
echo "The level: $level"
}
# function call with random positional parameters
service --service "repair" --price "10" --level "high"
echo ""
service --price "5" --service "computer" --level "medium"

上面的命令将输出如下内容:

The service: repair
The price: 10
The level: high
The service: computer
The price: 5
The level: medium

正如你所看到的,我必须使用getopt来使这个函数调用更灵活,更可读。是否有其他方法,我可以使用,而不是上面的getopt?有十几个函数,如果我这样用的话代码会很长

传递环境中的所有内容:

#!/bin/bash
service() {
: ${service="default service"}
: ${price="default price"}
: ${level="default level"}
echo "The service: $service"
echo "The price: $price"
echo "The level: $level"
}
service=repair price=15 service
service=install level=5 service
service=install price=10 level=5 service

这将产生:

The service: repair
The price: 15
The level: default level
The service: install
The price: default price
The level: 5
The service: install
The price: 10
The level: 5

您可以将位置参数与以下内容混合使用:

#!/bin/bash
service() {
: ${service=${1-"default service"}}
: ${price=${2-"default price"}}
: ${level=${3="default level"}}
echo "The service: $service"
echo "The price: $price"
echo "The level: $level"
}
level=supreme service install 15

相关内容