如何通过 getopts 参数传递命令并执行它?
How to pass the command via getopts argument and execute it?
我正在尝试做一些应用,但在这里描述它太难了,所以我将我的问题简化为更简单的问题。
我只想制作一个带有两个参数的脚本:时间和命令。它使用 getopts 解析参数,等待一段时间并执行给定的命令。
我尝试使用双引号、单引号和完全不使用引号的各种组合,使用 bash 数组(我认为如此)并寻找类似的问题,但没有帮助.
script.sh
time=1
command=""
while getopts "t:x:" opt; do
case $opt in
t) time=$OPTARG;;
x) command=( "$OPTARG" );; # store the command in a variable
esac
done
sleep $time
"${command[@]}" # execute the stored command
test.sh
# script to test arguments passing
echo "1 2 3 4"
执行脚本的结果应该与执行-x参数中传递的命令的结果相同。
$./script.sh -x "./test.sh a 'b c'"
1a 2'b 3c' 4 # actual results
$./test.sh a 'b c'
1a 2b c 3 4 # expected results
将"${command[@]}"
更改为eval "${command[0]}"
没有评估的解决方案:
#!/usr/bin/env bash
time=1
command=""
while getopts "t:x:" opt; do
case "${opt}" in
t)
time="${OPTARG}"
;;
x)
command="${OPTARG}" # get the command
# shift out already processed arguments
shift "$(( OPTIND - 1 ))"
# and exit the getopts loop, so remaining arguments
# are passed to the command
break
;;
*) exit 1 ;; # Unknown option
esac
done
sleep "${time}"
"${command}" "${@}" # execute the command with its arguments
我正在尝试做一些应用,但在这里描述它太难了,所以我将我的问题简化为更简单的问题。
我只想制作一个带有两个参数的脚本:时间和命令。它使用 getopts 解析参数,等待一段时间并执行给定的命令。
我尝试使用双引号、单引号和完全不使用引号的各种组合,使用 bash 数组(我认为如此)并寻找类似的问题,但没有帮助.
script.sh
time=1
command=""
while getopts "t:x:" opt; do
case $opt in
t) time=$OPTARG;;
x) command=( "$OPTARG" );; # store the command in a variable
esac
done
sleep $time
"${command[@]}" # execute the stored command
test.sh
# script to test arguments passing
echo "1 2 3 4"
执行脚本的结果应该与执行-x参数中传递的命令的结果相同。
$./script.sh -x "./test.sh a 'b c'"
1a 2'b 3c' 4 # actual results
$./test.sh a 'b c'
1a 2b c 3 4 # expected results
将"${command[@]}"
更改为eval "${command[0]}"
没有评估的解决方案:
#!/usr/bin/env bash
time=1
command=""
while getopts "t:x:" opt; do
case "${opt}" in
t)
time="${OPTARG}"
;;
x)
command="${OPTARG}" # get the command
# shift out already processed arguments
shift "$(( OPTIND - 1 ))"
# and exit the getopts loop, so remaining arguments
# are passed to the command
break
;;
*) exit 1 ;; # Unknown option
esac
done
sleep "${time}"
"${command}" "${@}" # execute the command with its arguments