Вопрос по linux, bash – Сохранить кавычки в аргументах bash

17

Я делаю сценарий bash, который будет печатать и передавать сложные аргументы другой внешней программе.

./script -m [email protected],[email protected] -o -q -- 'uptime ; uname -a'

Как мне распечатать необработанные аргументы как таковые:

-m [email protected],[email protected] -o -q -- 'uptime ; uname -a'

С помощью[email protected] а также$* удаляет одинарные кавычкиuptime ; uname -a что может привести к нежелательным результатам. Мой скрипт не должен анализировать каждый аргумент. Мне просто нужно напечатать / записать строку аргумента и передать их другой программе точно так, как они заданы.

Я знаю, что могу избежать кавычек с чем-то вроде"'uptime ; uname -a'" но я не могу гарантировать, что пользователь сделает это.

Не могу гарантировать, что пользователь избежит кавычек. aus
\'uptime ; uname -a\' ? karlphillip

Ваш Ответ

3   ответа
4

Если вы хотите напечатать список аргументов как можно ближе к тому, что, вероятно, ввел пользователь:

#!/bin/bash
chars='[ !"#$&()*,;<>?\^`{|}]'
for arg
do
    if [[ $arg == *\'* ]]
    then
        arg=\""$arg"\"
    elif [[ $arg == *$chars* ]]
    then
        arg="'$arg'"
    fi
    allargs+=("$arg")    # ${allargs[@]} is to be used only for printing
done
printf '%s\n' "${allargs[*]}"

Это не идеально. Аргумент как''\''"' труднее приспособить, чем оправдано.

3

Если пользователь вызывает вашу команду как:

./script 'foo'

первый аргумент, данный сценарию, является строкойfoo без кавычек. В вашем сценарии нет способа различить этот и любой другой метод, с помощью которого он может получитьfoo в качестве аргумента (например,./script $(echo foo) или же./script foo или же./script "foo" или же./script \f\o""''""o).

Error: User Rate Limit Exceeded"[email protected]"Error: User Rate Limit Exceeded aus
14

Кавычки удаляются до того, как аргументы передаются в ваш скрипт, поэтому их слишком поздно сохранять. Что вы можете сделать, так это сохранить их эффект при передаче аргументов внутренней команде и восстановить эквивалентную кавычку / экранированную версию аргументов для печати.

Для передачи аргументов во внутреннюю команду"[email protected]" - в двойных кавычках $ @ сохраняет исходные разрывы слов, а это означает, что внутренняя команда получает точно такой же список аргументов, что и ваш скрипт.

Для печати вы можете использовать формат% q в команде bash printf, чтобы восстановить цитату. Обратите внимание, что это не всегда восстанавливает первоначальное цитирование, но создаетequivalent строка в кавычках / экранированная Например, если вы передали аргумент'uptime ; uname -a' это может напечататьuptime\ \;\ uname\ -a или же"uptime ; uname -a" или любой другой эквивалент (см. ответ @William Pursell's для похожих примеров).

Вот пример их использования:

printf "Running command:"
printf " %q" innercmd "[email protected]" # note the space before %q -- this inserts spaces between arguments
printf "\n"
innercmd "[email protected]"
"[email protected]"Error: User Rate Limit Exceeded aus
Error: User Rate Limit Exceeded%qError: User Rate Limit Exceeded aus

Похожие вопросы