Я бы сделал это за один проход, используя awk, который поддерживает ENVIRON[]
, например, любой POSIX awk:
$ cat tst.sh
#!/bin/env bash
echo "Running the build script..."
VAR1=2005648 \
VAR2=7445aa \
SERVER_NAME=$(hostname) \
TIMESTAMP=$(date +%m-%d-%Y) \
awk '
{
while ( match($0,/{[[:alnum:]_]+}/) ) {
printf "%s", substr($0,1,RSTART-1) ENVIRON[substr($0,RSTART+1,RLENGTH-2)]
$0 = substr($0,RSTART+RLENGTH)
}
print
}
' file
$ ./tst.sh
Running the build script...
Building finished at 04-14-2020
2005648:7445aa
On: MyLogin
current working directory: /home/MyLogin
, но если вы действительно хотите сделать несколько проходов, вызывая sed внутри оболочка l oop, тогда ${!variable}
ваш друг, вот начало:
$ cat tst.sh
#!/bin/env bash
VAR1='2005648'
VAR2='7445aa'
SERVER_NAME='foo'
for var in VAR1 VAR2 SERVER_NAME; do
echo "var, $var, ${!var}"
done
$ ./tst.sh
var, VAR1, 2005648
var, VAR2, 7445aa
var, SERVER_NAME, foo
.
$ VAR1='stuff'
$ var='VAR1'; echo 'foo {VAR1} bar' | sed "s/{$var}/${!var}/"
foo stuff bar
Скрипт awk устойчив, но YMMV использует sed в зависимости от содержимого переменных, например, произойдет сбой, если они содержат &
или /
, или \1
, или .... ENVIRON [] имеет доступ только к переменным оболочки, установленным в командной строке awk или экспортированным, следовательно, экранирование в конец каждой строки, которая устанавливает переменную оболочки, так что она является частью командной строки awk.