簡體   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