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.
Используйте 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' "$@"
}
См. также:
Попробуйте это:
function example { printf 'TextBefore %s TextAfter\n' "$@"; }
Хотя оба ответа предполагают, что 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
' подводных камней и недостатков не стоит труда в таком простом случае.