[英]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.