Функция Bash: выполнить команду $@, при этом каждый аргумент в последовательности выполняется отдельно

Porque el operador &&no se reconoce después de la expansión variable. Tampoco lo son las comillas :si eso funcionara, se imprimiría "tt". (Prueba:cmd='echo "tt"'; $cmd)

Conviértalo en una función:

checktmp() {
    [ -r /tmp ] && echo "tt"
}
checktmp

Las funciones son para el código, las variables para los datos.

3
15.06.2019, 04:54
3 ответа

Используйте printfвместо echo. Утилита printfпринимает строку формата в качестве первого аргумента (, которая может всегда быть строкой в ​​одинарных кавычках ), и эта строка будет содержать заполнитель для других ваших аргументов:

printf 'TextBefore %s TextAfter\n' "$@"

Аргументы в "$@"будут вставлены в позицию, заданную %s. Поскольку в строке формата есть только один заполнитель %s, строка формата будет повторно использоваться для каждого аргумента по очереди. Это отличается от того, как printfработает на других языках.

Обратите внимание, что printfпо умолчанию не выводит завершающий символ новой строки.

Пример:

$ printf 'AAA %s BBB\n' 1 2 3 4 5
AAA 1 BBB
AAA 2 BBB
AAA 3 BBB
AAA 4 BBB
AAA 5 BBB

Если в строке форматирования есть дополнительные заполнители, они будут по очереди заполнены аргументами, заданными для printf. Строка форматирования будет повторно использована, когда все заполнители будут заполнены, если есть еще доступные аргументы.

$ printf 'AAA %s %03d BBB\n' 1 2 3 4 5
AAA 1 002 BBB
AAA 3 004 BBB
AAA 5 000 BBB

Таким образом, ваша функция может выглядеть так:

example () {
    [ "$#" -gt 0 ] && printf 'TextBefore %s TextAfter\n' "$@"
}

См. также:

4
27.01.2020, 21:07

Попробуйте это:

function example { printf 'TextBefore %s TextAfter\n' "$@"; }
11
27.01.2020, 21:07

Хотя оба ответа предполагают, что OP просто хочет напечатать аргументы, может случиться так, что они захотят передать аргументы в квадратных скобках другой команде , а не echoили printf.

В оболочке нет mapcarи т. д. [1], поэтому единственный способ — это тривиальный цикл (замена заполнителя cmdфактической командой):

function example { for arg; do cmd "TextBefore $arg TextAfter"; done; }

В качестве примечания: в исходном echo "TextBefore $@ TextAfter"при вызове с $@, установленным в A1B, A2B,..., A5B, отдельные аргументы, переданные в echo, будут TextBefore A1B, A2B,..., A5B TextAfter. Это тот случай, когда использование $@едва ли имеет смысл.

[1] есть xargs, но обход xargs' подводных камней и недостатков не стоит труда в таком простом случае.

3
27.01.2020, 21:07

Теги

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