问题描述
我有一个bash脚本,应该将其参数打印成两行。第一行应为第一个参数,第二行应为其余参数
#!/bin/bash
FIRST_ARG="$1"
shift
REST_ARGS="$@"
echo $FIRST_ARG
echo $REST_ARGS
这对于正常的参数(例如
)很好root@us:~# /bin/bash parse.sh testName test1 test2 test3
testName
test1 test2 test3
root@us:~#
但是,我想要发送一个键值对作为参数,例如
testName "X-Api-Key: 1be0ad48" "Name: someTest" "Interval: * * * * *"
我希望这会产生如下结果
testName
"X-Api-Key: 1be0ad48" "Name: someTest" "Interval: * * * * *"
包括引号。但是,我得到以下结果
root@us:~# /bin/bash parse.sh testName "X-Api-Key: 1be0ad48" "Name: someTest" "Interval: * * * * *"
testName
X-Api-Key: 1be0ad48 Name: someTest Interval: parse.sh parse.sh parse.sh parse.sh parse.sh
root@us:~#
我不想在这里发生两件事。 1)删除引号“,2)将*替换为文件名。
我尝试用“来转义那些字符,但是没有用。有没有办法解决这个问题?我在哪里做错了?
解决方法
唯一隐藏命令行参数的方法是在数组中:
#!/bin/bash
first_arg="$1"
shift
rest_args=("$@")
# ........^....^
# show how bash has stored these variables
declare -p first_arg
declare -p rest_args
echo "first = $first_arg"
for arg in "${rest_args[@]}"; do
echo "arg = $arg"
done
摆脱使用ALLCAPS变量名的习惯,将那些保留为Shell保留。有一天,您将先写PATH=something
,然后再写wonder why your script is broken。
*
被展开是因为您正在执行echo
而没有引用$REST_ARGS
。尝试添加这样的报价:
#!/bin/bash
FIRST_ARG="$1"
shift
REST_ARGS="$@"
echo "$FIRST_ARG"
echo "$REST_ARGS"
保留双引号的一种解决方案是使用单引号'
来对字符串加引号,如下所示:
$ bash parse.sh testName '"X-Api-Key: 1be0ad48"' '"Name: someTest"' '"Interval: * * * * *"'
testName
"X-Api-Key: 1be0ad48" "Name: someTest" "Interval: * * * * *"
$
,
您要做什么?
#!/usr/bin/env sh
echo "$1"
shift
printf '"%s" ' "$@"
# or alternatively:
# env printf '%q ' "$@"
echo