繁体   English   中英

Bash 打印除 first 之外的所有参数 - 打印返回文件名

[英]Bash print all arguments except first - print returns file names

我有一个 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然后想知道为什么你的脚本被破坏了

*被扩展,因为您正在执行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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM