Bash打印除第一个参数外的所有参数-打印返回文件名

问题描述

我有一个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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...