Итак, вы хотите запустить wget? Это пример извлечения файла rpm и его установки. Я также создаю файл в «/ etc / firstruns /», чтобы он не запускался каждый раз. "created" говорит: "Эй, я создаю этот файл, когда закончу ... так что, если он уже есть, мне не нужно этого делать!". Вы также можете просто указать путь в команде. Параметр пути не обязателен. Не стесняйтесь добавить и удаление оборотов.
exec { 'wget':
path => [ "/bin/", "/sbin/", "/usr/bin/", "/usr/sbin/" ],
command => "/bin/wget <URL> && rpm -ivh <RPM>",
cwd => '/tmp/',
creates => '/etc/firstruns/p1.done',
}
Могу только предположить, что меня ударили бы за неправильные действия, но это ответ: D
Вы можете выполнить то, что пытаетесь сделать, используя двойные кавычки в сценарии awk для внедрения в него переменной оболочки. Вы все еще хотите сохранить в нем один литерал $
, что вы можете сделать, экранировав его обратной косой чертой:
echo $(awk -F, "{print \$$i}" <<<$var)
Это расширит $i
до 1
, 2
и 3
в каждой из итераций, поэтому awk увидит $1
, $2
и $3
, что заставит его расширить каждую из итераций. поля.
Другая возможность — внедрить переменную оболочки как переменную awk, используя флаг -v
:
echo $(awk -F, -v i="$i" '{print $i}' <<<$var)
Это присваивает переменной awk i содержимое переменной оболочки с тем же именем. Переменные в awk не используют $
, который используется для полей, поэтому $i
достаточно для ссылки на i --е поле, если i является переменной в awk..
Назначение awk-переменной с помощью -v
обычно является более безопасным подходом, особенно когда она может содержать произвольные последовательности символов, в этом случае меньше риск того, что содержимое будет выполнено как awk-код вопреки вашим намерениям. Но поскольку в вашем случае переменная содержит одно целое число, это не так важно.
Еще один вариант — использовать цикл for
в самом awk. См. документацию по awk (или выполните поиск на этом сайте )для получения дополнительной информации о том, как это сделать.
awk может принимать какj
(как переменную ), так и$j
(как индекс поля):
for i in 1 2 3; do echo "$var" | awk -v j=$i -F, '{print $j}'; done
$i
в примере «запутался» awk
, какой использовать (оболочку или собственную переменную -, имеющую приоритет ), так как обе они упоминаются с префиксом $
.
оболочка sh , стандартная для «переносимых» сценариев, не поддерживает:
(( i=1; i<=3; i++; ))
и <<< $var
конструкции
Также вы можете рассмотреть возможность использования команды seq
в цикле for
для более точного управления генерацией числовой последовательности, если она доступна.
Использование awk
кажется чрезмерным в данном случае, как насчет tr
и цикла while -:
tr, '\n' <<<"$var" | while read; do
echo $REPLY
done
Выход:
data1
data2
data3
#!/bin/sh
var='data1,data2,data3'
unset data
while [ "$var" != "$data" ]; do
data=${var%%,*} # delete first comma and the bit after it
var=${var#*,} # delete bit up to first comma (and the comma)
printf 'data = "%s"\n' "$data"
done
Здесь мы используем подстановку переменных, чтобы получить каждое последующее поле данных, разделенное запятой -, из значения переменной var
. Первое присвоение data
в цикле удалит все из $var
после первой запятой. Затем переменная var
модифицируется таким образом, что удаляется первый бит до первой запятой.
Это продолжается до "$var" = "$data"
, что означает, что больше ничего нельзя сделать со строкой.
Такой способ позволит нам обрабатывать разделенные запятыми -строки данных, которые содержат встроенные символы новой строки:
var='line1
line2,data2,last bit
goes here'
С указанными выше значениями в var
приведенный выше скрипт выведет
data = "line1
line2"
data = "data2"
data = "last bit
goes here"
Не заботиться о встроенных новых строках; Вам очень редко приходится зацикливаться на вызовах awk
.
Обратите внимание, что awk
прекрасно читает вашу строку как набор полей, -разделенных запятыми, и что он может перебирать эти:
printf '%s\n' "$var" |
awk -F ',' '{ for (i=1; i<=NF; i++) print $i }'
С var='data1,data2,data3'
будет напечатано
data1
data2
data3
Другое решение оболочки, которое использует переменную IFS
для разделения значения $var
на биты, а также использует set -f
для отключения расширения имени файла:
set -f
oldIFS=$IFS; IFS=','
set -- $var
IFS=$oldIFS; unset oldIFS
set +f
for data do
printf 'data = "%s"\n' "$data"
done