(jw013 уже дал корректный ответ, но я хочу указать еще на несколько проблем.)
Правая сторона конвейера работает в его собственной подоболочке в ударе (а также большинство других оболочек, при этом исключениями является ATT ksh и zsh). Таким образом, Вы устанавливаете переменные среды в подоболочке, которая выполняет цикл, но не в основном процессе оболочки.
Здесь существует легкая фиксация, которая должна заменить бесполезное использование cat
перенаправлением:
while read …; do …; done <"$1"
В целом, если необходимо предварительно обработать вход, поместить цикл и остаток от сценария (по крайней мере, часть, которой нужны замененные переменные) в блоке.
grep '^foo_' "$1" | {
while read …; do …; done
do_something
}
Отметьте это в целом, while read line; do …
действительно не совсем выполняет итерации по входным строкам. Посмотрите, Почему while IFS= read
используемый так часто, вместо IFS=; while read..
? для объяснения. Корректная идиома для итерации по входным строкам
while IFS= read -r line; do …
Здесь, удаление продвижения и запаздывающего пробела не имеет значения, так как не должно быть никого, учитывая Ваш демонстрационный вход, но Вам, возможно, понадобится -r
избегать расширения обратной косой черты. Это возможно это while read line
на самом деле корректный способ считать Ваш вход (но я подозреваю, только если значения переменных не содержат новых строк). Также возможно, что Ваш формат ввода неоднозначен или более сложен для парсинга. Проверьте то, что происходит, если одно из значения переменных содержит символ новой строки, двойную кавычку или обратную косую черту.
Одна точка, где Вы определенно искажаете вход, - при извлечении значения:
val=`echo ${kv#*=} | sed 's/^"\|"$//g'`
Во-первых, необходимо использовать двойные кавычки вокруг подстановки переменных: echo "${kv#*=}"
; иначе оболочка выполняет разделение слова и поколение имени файла (т.е. globbing) на нем. Во-вторых, echo
надежный путь не состоит в том, чтобы распечатать строку, потому что некоторые строки, которые начинаются с a -
рассматриваются как опции, и некоторые оболочки выполняют расширение обратной косой черты на аргументе. Надежный и портативный способ распечатать строку printf %s "${kv#*=}"
. Кроме того, если значение охватит несколько строк, то sed программа будет действовать на каждого отдельно, который неправ. Это является закрепляемым, но существует более легкий метод, который должен использовать средства обработки строк оболочки: val=${kv#*=}; val=${val#\"}; val=${val%\"}
.
Предположение, что вход правильно анализируется с плоскостью read
, вот более простой способ проанализировать его, используя в своих интересах IFS
установка для разделения каждой строки:
while read name value; do
value=${value#\"}; value=${value%\"}
export name="$value"
done <"$1"
Проверка по сравнению с этим списком: http://ark.intel.com/search/advanced/?s=t&AESTech=true. Это также могла бы быть опция в Вашем BIOS, хотя я сомневаюсь относительно этого.
Многие компании не активируют опцию AES в ноутбуках. Для моей Asus я нашел решение здесь: http://forum.notebookreview.com/windows-os-software/582628-aes-ni-support-truecrypt-sandy-bridge-problem-15.html#post8002488
Я следовал за этим немного шагов и успешно изменил мой BIOS. Возможно, это поможет Вам также.
Никакая потребность проверить сайт Intel,
Просто посмотрите если aes
один из Ваших флагов ЦП grep aes /proc/cpuinfo
(Работы для меня: i5 2450 м)
Если Вы получили соответствие, оно поддерживается.
/proc/cpuinfo
. Я думаю, что этим различием является причина, он задал вопросу во-первых
– pqnet
01.09.2014, 00:37