Shell, Связывая 2 строки для ссылки на 3-ю переменную

Ответ жабр был почти там, но по некоторым причинам я должен был передать по каналу через formail дважды. Кроме того, я должен был на самом деле отправить почту после перезаписи заголовков. Вот то, что я сделал, чтобы заставить эту целую вещь работать:

  1. Я создал новый файл ~/bin/resend-support содержа:

    #!/bin/bash
    
    /usr/bin/formail -R To: From: | \
      /usr/bin/formail -U From: -I Cc: -I 'To: support@mydomain.com' | \
      /usr/sbin/sendmail -oi -t
    
  2. Я сделал исполняемый файл файла (chmod +x ~/bin/resend-support)

  3. В cPanel я создал средство передачи адреса электронной почты resend-support@mydomain.com который переданный по каналу к ~/bin/resend-support (использующий "Канал для программы" под "Усовершенствованным")

Теперь, когда я посылаю электронное письмо someone@example.com и CC resend-support@mydomain.com, это передается по каналу к ~/bin/resend-support который снова посылает электронную почту support@mydomain.com от someone@example.com

6
31.07.2013, 11:15
4 ответа

Вы ищете это?

$ cat indirection.bash
#!/bin/bash -x

var1=www
var2=www2
var3=www3
var4=www4
for i in 1 2 3 4; do
        s="var${i}"
        echo "${!s}"
done

 

$ ./indirection.bash
www
www2
www3
www4
11
27.01.2020, 20:20
  • 1
    Как Ваш сценарий работает без ! в хижине!? –  sasha.sochka 01.08.2013, 23:43
  • 2
    @sasha.sochka из кода OP... исправленного, спасибо. –  Adrian Frühwirth 02.08.2013, 10:19

Вы могли использовать массив:

#/bin/bash -x

declare -a vars=(
    www
    www2
    www3
    www4
)

for var in "${vars[@]}"; do
   echo "$var"
done

Или выполните итерации с индексом:

for i in "${!vars[@]}"; do
    echo "${vars[$i]}"
done
7
27.01.2020, 20:20
  • 1
    , Вы всегда хотите заключить в кавычки "${vars[@]}", иначе для цикла повредится на любом пробеле в значениях элемента массива. например. var=("elem 1" "elem 2"). Только опустите двойные кавычки, если Вы хотите это (обычно неожиданный) поведение. ВОЗВРАТ –  glenn jackman 31.07.2013, 13:59
  • 2
    Вы правы, я забыл это. –  ahilsend 31.07.2013, 15:53

Обычно оболочка разворачивает переменную только однажды. Можно использовать косвенный, расширяются или просят окружать для расширения его еще раз, например:

eval "val=\$var$i"; echo "$val";

вместо просто:

echo "\$var$i"

Этот метод является очень портативным, но использует зло eval.

Используя косвенное расширение как показано в других ответах (см. Расширение Параметра в ударе человека), ${!VAR_NAME} хорошее решение, когда мобильность не необходима, и Вам разрешают использовать расширения Bash.

3
27.01.2020, 20:20

Используйте ассоциативный массив. Нет никакого серьезного основания генерировать имена переменной как это.

2
27.01.2020, 20:20

Теги

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