Просто для полноты картины я также хочу предложить возможное использование bash, встроенного в read.Я также внес исправления в отношении -d '', основываясь на комментариях socowi.
Но при использовании чтения необходимо соблюдать особую осторожность, чтобы убедиться, что вход очищен (-d '' читает до завершения нулевого значения и printf "... \ 0 "завершает значение нулем), и это чтение выполняется в основной оболочке, где требуется переменная, а не в подоболочке (отсюда и синтаксис <<(...)). </p>
var=x; val=foo0shouldnotterminateearly
read -d'' -r "$var" < <(printf "$val\0")
echo $x # --> foo0shouldnotterminateearly
echo ${!var} # --> foo0shouldnotterminateearly
Я проверил это с пробелами \ n \ t \ r и 0, и т. Д. Это работало, как и ожидалось, в моей версии bash.
-r избежит экранирования \, так что если у вас былосимволы "\" и "n" в вашем значении, а не фактическая новая строка, x также будет содержать два символа "\" и "n".
Этот метод может быть эстетически не таким приятным, как evalили printf решение, и было бы более полезно, если значение поступает из файла или другого дескриптора входного файла
read -d'' -r "$var" < <( cat $file )
А вот несколько альтернативных предложений для синтаксиса <<() </p>
read -d'' -r "$var" <<< "$val"$'\0'
read -d'' -r "$var" < <(printf "$val") #Apparently I didn't even need the \0, the printf process ending was enough to trigger the read to finish.
read -d'' -r "$var" <<< $(printf "$val")
read -d'' -r "$var" <<< "$val"
read -d'' -r "$var" < <(printf "$val")