【发布时间】:2018-05-31 16:46:31
【问题描述】:
我在下面有一个脚本,它获取 bash 脚本目录,然后解析命令的标志以从源文件中运行特定函数。
在scripts 目录中给定这个函数:
function reggiEcho () {
echo $1
}
这里是一些电流输出的例子
$ reggi --echo hello
hello
$ reggi --echo hello world
hello
$ reggi --echo "hello world"
hello
$ reggi --echo "hello" --echo "world"
hello
world
正如您所见,引用的参数不被尊重,因为它们应该是 `"hello world" 应该正确回显。
这是脚本,问题在 while 循环内。
如何解析这些标志,并保持将带引号的参数传递给函数?
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
STR="$(find $DIR/scripts -type f -name '*.sh' -print)"
ARR=( $STR )
TUSAGE="\n"
for f in "${ARR[@]}"; do
if [ -f $f ]
then
. $f --source-only
if [ -z "$USAGE" ]
then
:
else
TUSAGE="$TUSAGE \t$USAGE\n"
fi
USAGE=""
else
echo "$f not found"
fi
done
TUSAGE="$TUSAGE \t--help (shows this help output)\n"
function usage() {
echo "Usage: --function <args> [--function <args>]"
echo $TUSAGE
exit 1
}
HELP=false
cmd=()
while [ $# -gt 0 ]; do # loop until no args left
if [[ $1 = '--help' ]] || [[ $1 = '-h' ]] || [[ $1 = '--h' ]] || [[ $1 = '-help' ]]; then
HELP=true
fi
if [[ $1 = --* ]] || [[ $1 = -* ]]; then # arg starts with --
if [[ ${#cmd[@]} -gt 0 ]]; then
"${cmd[@]}"
fi
top=`echo $1 | tr -d -` # remove all flags
top=`echo ${top:0:1} | tr '[a-z]' '[A-Z]'`${top:1} # make sure first letter is uppercase
top=reggi$top # prepend reggi
cmd=( "$top" ) # start new array
else
echo $1
cmd+=( "$1" )
fi
shift
done
if [[ "$HELP" = true ]]; then
usage
elif [[ ${#cmd[@]} -gt 0 ]]; then
${cmd[@]}
else
usage
fi
【问题讨论】:
-
如果您可以像
ARR=( $STR )那样使用分词安全地填充数组,那么您一开始就不需要数组。 -
第一个
ARR=( $STR )只是为了拆分文件以便我可以获取它们,这不是参数解析部分。 -
仍然是错误的,如果它与您实际询问的内容无关,则不属于问题。
-
添加一个shebang,然后将您的脚本粘贴到那里:shellcheck.net
-
你用
shell标记了这个问题。请注意,posix shell 没有数组。
标签: bash shell terminal command-line-interface