Как анализировать файл, подобный этому, и определять переменные?

Пример файла:

/Variable1=Value1/Variable2=Value Value Value/Variable3=Value3 Value3/ 

Я хочу, чтобы он прочитал переменные и установил их. Смысл я мог бы ввести echo $Variable1 и получить Value1 в качестве вывода и т. Д. Я пробовал много вещей, но они были очень длинными и не работали, когда переменные меняли имена. Кто-нибудь знает эффективный метод для этого?

Вот исходная точка bash :

 OIFS="$IFS" IFS=/; set -f for piece in $(cat file) do var=$(echo "$piece" | cut -d= -f1) val=$(echo "$piece" | cut -d= -f2-) [ -n "$var" ] && eval $var=\"$val\" done IFS="$OIFS" unset piece var val 

Хотя он пропускает имена пустой переменной, это не делает никакой проверки работоспособности самих имен переменных.

Во-вторых, поскольку я решил найти способ сделать это, read :

 declare -a vars IFS=/ read -a vars < file for piece in ${vars[*]} do mangle=$(echo "$piece" | sed 's/=\(.*\)/="\1"/') eval $mangle done unset vars piece mangle 

Строка манула – это просто, чтобы процитировать значение после знака равенства.

как и ответ Джеффа Шаллера:

 IFS=/; set -f set -- $(tr /\\n \\n/ <file | sed -ne's/^[_[:alpha:]][_[:alnum:]]*=/_&/p' | tr /\\n \\n/) for v do eval "${v%%=*}=\${v#*=}"; done 
 . <( awk ' BEGIN{RS="/";FS="="} NF==2{printf "%s=\"%s\"\n", $1, $2} ' file ) 

Для этого используется awk чтобы сделать следующий текст:

 Variable1="Value1" Variable2="Value Value Value" Variable3="Value3 Value3" 

Это источник, поэтому Variable{1,2,3} доступна в sh .

Некоторые моменты: предполагается, что значения не содержат ant / , = , или " .

 $ printf "%s\n" "$Variable1" "$Variable2" "$Variable3" $ cat file /Variable1=Value1/Variable2=Value Value Value/Variable3=Value3 Value3/ $ source <(tr / "\n" < file | sed -r 's/=(.*)/="\1"/') $ printf "%s\n" "$Variable1" "$Variable2" "$Variable3" Value1 Value Value Value Value3 Value3 

Для bash: (если ваша строка находится в файле с именем «liste.txt»)

 IFS="/" for val in $(cat liste.txt); do echo "$val" | sed -r "s/=(.*)$/=\"\1\"/g" | eval; done 

После этого вам просто нужно попробовать:

 echo "$Varaible1" echo "$Variable2" 

и так далее