В присвоении переменной сценария удара не работают

Обычно я просто crontab -u user file в чем-то вроде /etc/rc.local и загружаю вкладку cron. В остальном, делать особо нечего.

Обычно я делаю что-то вроде: (в rc.local)

wget http://169.254.169.254/latest/meta-data/instance-id -O /tmp/instance  
INSTANCE=`cat /tmp/instance`
KEY="/etc/pk.pem"
CERT="/etc/cert.pem"
CONFIG=`ec2-describe-tags -K $KEY -C $CERT -F "resource-id=$INSTANCE" -F "key=ConfigBucket" | awk '{print $5}'`
if  [ -n $CONFIG ]; then
    s3cmd -c /etc/.s3cfg sync s3://$CONFIG/etc/ /etc
    chmod +x /etc/post-ec2-start.sh
    /etc/post-ec2-start.sh
fi

exit 0

Затем в /etc/post-ec2-start.sh

#!/bin/bash
wget http://169.254.169.254/latest/meta-data/instance-id -O /tmp/instance
INSTANCE=`cat /tmp/instance`
KEY="/etc/pk.pem"
CERT="/etc/cert.pem"

VOL1="vol-12345678"
VOL2="vol-87654321"
IP="54.123.123.132"

ec2-attach-volume -K $KEY  -C $CERT $VOL1 -i "$INSTANCE" -d /dev/sdf
ec2-attach-volume -K $KEY  -C $CERT $VOL2 -i "$INSTANCE" -d /dev/sdg
ec2-associate-address -K $KEY  -C $CERT -i "$INSTANCE" $IP
sleep 90
mount /dev/sdf1 /home/
mount /dev/sdg1 /var/lib/mysql

hostname some.fqdn.com




#register crontabs
#crontab -u coteyr /etc/coteyr.crontab
crontab -u root /etc/root.crontab

#fix home directoris
cd /home/
for i in *; do 
    useradd $i
    chown -R $i:$i /home/$i
done

Это имеет преимущество загрузки конфигурации из S3, а затем запуска на основе этой конфигурации. Если бы мне нужно было что-то запустить при (повторной) загрузке, я бы просто добавил это в /etc/post-ec2-start.sh или /etc/rc.local, в зависимости от того, нужно ли мне это в процессе настройки конфигурации или после завершения настройки. Что-то похожее должно сработать и для вас.

1
06.04.2018, 15:49
3 ответа

Используйте синтаксис арифметического выражения для выполнения математических операций:

count=10
(( nextcount = count + 1 ))
1
27.01.2020, 23:18

Как всегда, присваивание в оболочке не принимает пробелы (см.:Пробелы в присваиваниях переменных в сценариях оболочки):что-то вроде var=foo barзапускает команду barс varустановлено на foo. Или, в вашем случае, это команда +, что вполне нормально, поскольку +не имеет особого значения для оболочки (в любом случае ). Кроме того, var=1+1принимает правую часть строки 1+1, так как плюс — это обычный символ. Если бы оно имело особое значение (, например ;или (), вам нужно было бы указать его в кавычках.

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

anothervar=$((var + 1))

Если вы используете Bash/ksh/zsh и просто хотите зациклить постоянное количество итераций, вы можете использовать:

for (( i = 0; i < 10 ; i++)); do something ; done

(for i in {1..10}также будет работать, но в Bash раскрытие переменных не работает внутри раскрытия фигурных скобок.)

6
27.01.2020, 23:18

Можно сделать что-то похожее на то, что вы показали, используяdeclare -i:

declare -i nextcount
nextcount=$count+1

Это объявляет переменную nextcountс целочисленным атрибутом, что приводит к автоматическому арифметическому вычислению при каждом назначении. (Запустите help declareв bash или посмотрите здесь для получения подробной информации. )Это не стандартная функция оболочки POSIX, но bash ее поддерживает.

Назначение не обязательно должно следовать непосредственно за командой declare. Если это так, вы можете сделать это с помощью команды declare,вот так:

declare -i nextcount=$count+1

Поддерживаются любые арифметические выражения с целыми числами и арифметическими операторами . Если операторы рискуют быть специально интерпретированы оболочкой по-другому, вы можете заключить выражение в кавычки, чтобы предотвратить это. Помните, что вы присваиваете текст переменной; над этим текстом выполняется арифметическая оценка. Для другого примера, после этой команды $xрасширится до13:

declare -i x='2 * 7 - 1'

Даже если вы удалили пробелы, вы бы хотели, чтобы это было заключено в кавычки, потому что *иначе интерпретировало бы его как glob , запуская расширение имени файла . Обратите внимание, что вокруг =не должно быть пробелов.

Хотя обычно вы так не поступаете. Часто проще, элегантнее и читабельнее использовать арифметическое расширение$)или арифметическую оценку(без $), как предполагают другие ответы. Я представляю метод, показанный здесь, не для того, чтобы побудить вас предпочесть его, а главным образом потому, что он наиболее близок к тому, что показано в вашей книге, и фактически выполняет арифметику оболочки.

Арифметические выражения --, под которыми я подразумеваю выражения, которые оцениваются с использованием арифметики оболочки, поскольку они находятся внутри$(())или (())--, позволяют использовать =с пробелами вокруг него. =в команде ((count = 10))синтаксически не работает так же, как =в команде count=10.


Если xимеет целочисленный атрибут (declare -i x), вы даже можете написать что-то подобное, чтобы присвоить значение нескольким переменным, хотя я бы не советовал этого делать на том основании, что это сбивает с толку:

x=y=z=10

Если вам интересно, что это делает, вот подсказка --это делает то же самое:

x='y = z = 10'

Это присваивает строкеy = z = 10(или, в первом примере,y=z=10)значение x. Важно, чтобы как минимум xимел целочисленный атрибут. Предполагая, что это так,этот текст оценивается как арифметическое выражение. Подвыражение z = 10присваивает 10значение z, но это подвыражение также имеет значение 10, которое присваивается y. Это полное выражение, которое является присваиванием y, также имеет значение, по-прежнему 10.

Обратите внимание, что первый =выполняет обычное присваивание переменной оболочки, а остальные являются арифметическим оператором присваивания. Это не специально для второй формы (той, которая, находясь в кавычках, может содержать пробелы ). В x=y=z=10первое =также означает нечто отличное от двух других =, хотя вы используете их для достижения той же цели. Это потенциально сбивает с толку. Я рекомендую не писать подобные вещи, за исключением, возможно, интерактивных целей для экспериментов. Вместо этого вы можете написать эту команду:

((x = y = z = 10))

Это простая арифметическая оценка. Все три знака =являются арифметическим оператором присваивания. Все еще хорошо, если вы объявили некоторые или все переменные с целочисленным атрибутом --, за который я часто выступаю --, но вам не нужно этого делать.


Аналогичным образом в bash есть оператор +=, который обычно добавляет текст:

$ x=foo
$ x+=bar
$ echo "$x"
foobar

(Начальные $символы в некоторых строках — это моя подсказка. Я включаю их сюда, чтобы отличать входные данные, которые я даю bash, от выходных данных, которые он производит.)

Но атрибуты назначенной -переменной влияют на то, какую операцию +=выполняет. +=обычно используется для расширения индексированных массивов:

$ a=(foo bar baz)
$ a+=(quux)
$ echo "${a[@]}"
foo bar baz quux

Когда переменной с целочисленным атрибутом присваивается значение +=, в -выполняется добавление места:

$ declare -i y=7
$ y+=2
$ echo "$y"
9

Но bash также имеет +=в качестве арифметического оператора, который я предлагаю использовать вместо него в большинстве случаев. То есть, если yсодержит значение 2,вместо этого вы можете написать это, чтобы увеличить значение yна 2:

((y += 2))

Он также имеет другие традиционные составные операторы присваивания (, которые присутствуют в языке C ). Например, предположим, что я хочу уменьшить значение yна 3. Это не работает:

$ y-=3
y-=3: command not found

Но это работает:

$ ((y -= 3))
$ echo "$y"
6

Или я мог бы просто сделать это, что одновременно изменяет yи печатает новое значение:

$ echo "$((y -= 3))"
6
0
27.01.2020, 23:18

Теги

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