Вы можете добиться того, чего хотите, используя структуру case control следующим образом:
#!/bin/bash
log1_length=$(wc -l <log1.txt)
log2_length=$(wc -l <log2.txt)
for i in $(seq $log1_length); do
arg1="$(head -$i <log1.txt | tail -1)"
arg2="$(head -$(((i-1) % log2_length + 1)) <log2.txt | tail -1)"
# Case control structure to replace digit equivalent in words
case ${i} in
1) echo -n "The first color ";;
2) echo -n "The second color ";;
3) echo -n "The third color ";;
4) echo -n "The fourth color ";;
5) echo -n "The fifth color ";;
6) echo -n "The sixth color ";;
7) echo -n "The seventh color ";;
8) echo -n "The eighth color ";;
9) echo -n "The ninth color ";;
10) echo -n "The tenth color ";;
11) echo -n "The eleventh color ";;
esac
echo ${i}"$i${arg1} is ${arg2}" | tr -d '0123456789'
done
Вывод выглядит следующим образом:
The first color Black is Ugly
The second color Blue is Nice
The third color Brown is cool
The fourth color Copper is pretty
The fifth color Cyan is Ugly
The sixth color Gold is Nice
The seventh color Gray is cool
The eighth color Green is pretty
ПВЗ:
Когда сценарий запускается из командной строки, но не запускается под cron
, причиной обычно являются PATH
различия или проблемы с синхронизацией ресурсов :
PATH
отличается:Ваше cron
задание не запускается с той же СРЕДОЙ , что и команды, выдаваемые из вашей интерактивной оболочки. printenv
может показать вам разницу:
$ printenv
...
PATH=/home/pi/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin: etc, etc
...
Итак,отредактируйте свой crontab
, чтобы создать задание cron
, которое запускает printenv
и перенаправляет вывод в файл:
* * * * * /usr/bin/printenv > /home/pi/mycronenvironment.txt 2>&1
Если вы вводите команду в своем crontab
, которая не в ее ПУТИ, вы можете либо :1 )изменить ПУТЬ, либо 2 )использовать полный путь к команда
cron
не знает о наличии ресурсов Чаще всего это происходит, когда задание планируется с помощью средства @reboot
. Например, если ваше задание cron
запускается во время загрузки и требует сетевых служб. Если сеть еще недоступна, ваша работа просто не удастся. А так как он не интерактивный , вы не увидите вывод(stdout
и/или stderr
), и любые сообщения об ошибках или предупреждения могут быть потеряны.
Решение часто состоит в том, чтобы добавить немного sleep
перед запуском вашей команды. Например:
@reboot /bin/sleep 20; /path/to/myscript >> /pi/home/myscriptlog.txt 2>&1
Когда cron
запускается во время загрузки и выполняется эта строка, cron
будет sleep
в течение 20 секунд перед выполнением следующей команды. Это почти всегда работает, но, конечно, неточно , поскольку мы можем не знать с какой-либо уверенностью, когда ресурсы станут доступными. Если этого требует ваша работа или если эта неопределенность беспокоит вас, вы должны рассмотретьsystemd
; он поддерживает видимость системных ресурсов во время процесса загрузки и может приступить к работе как можно скорее.
cron
по умолчанию /dev/null
Эта проблема устранена, как показано выше :a перенаправление из stderr
и stdout
в «файл журнала»:
>> /home/pi/cronjoboutput.log 2>&1