Как создать строку с выводом оболочки (backticks) в Bash? - PullRequest
0 голосов
/ 06 июня 2011

Я пытался создать строку с переменным количеством символов в ней для тестовой программы. Я пытаюсь использовать это для настройки строки моих сообщений:

messages=`perl -e 'print "X" x $size'`

Цель состоит в том, чтобы создать динамическое количество символов. Например, если $ size равен 1, тогда будет один X. Если size равен 5, сообщения будут XXXXX. Это не похоже на работу, и вывод пуст.

Я что-то неправильно понимаю?

Ответы [ 4 ]

2 голосов
/ 06 июня 2011

Причина, по которой bash не оценивается $size, заключается в том, что вы заключили его в одинарные кавычки ('). Это становится более очевидным, если вы используете синтаксис $(...) вместо обратных галочек:

messages=$( perl -e 'print "X" x $size' )

Принцип состоит в том, что все внутри одинарных кавычек не затрагивается bash (после разделения слов в конечном итоге удаляются только кавычки), в то время как вещи в двойных кавычках получают различные расширения оболочки (даже без кавычек).

Таким образом, Perl здесь получает $size и может только попытаться оценить это как переменную perl.

Как уже сказал другой Диего, замена кавычек может помочь:

messages=$( perl -e "print 'X' x $size" )
1 голос
/ 06 июня 2011

Попробуйте:

messages=`perl -e 'print "X" x shift' $size`

Вам нужно оценить $size в bash, а не в perl.Таким образом, вы передаете его в качестве аргумента командной строки в скрипт, а в Perl вы получаете один shift.

0 голосов
/ 15 ноября 2011

Ну, ИМХО вызов perl и awk для простой обработки строк - hackish . Простую задачу, подобную этой, можно выполнить напрямую:

in='X' out='' x=5
for ((i = 0; i < x; ++i)); do out+="$in"; done
0 голосов
/ 06 июня 2011

Другое возможное решение:

messages=`perl -e "print \"X\" x $size"`

или даже, играя с кавычками:

messages=`perl -e "print 'X' x $size"`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...