zsh: оставьте sla sh перед скобкой - PullRequest
0 голосов
/ 26 мая 2020

Мне нужно кэшировать строку из файла, чтобы позже выполнить поиск с помощью grep. В этой строке перед скобкой стоит sla sh. После того, как я беру строку и повторяю ее в оболочке, она ведет себя так, как я ожидал; но в моем сценарии он сбрасывает sla sh off.

Ниже много текста, но важная часть строки - «(Остающееся время)»

Строка в файле:

"session_will_expire_message" = "User session will expire in \(remainingTime). Please sign in again to avoid expiration in the middle of the transaction.";

Команда оболочки (работает должным образом):

% line="\"User session will expire in \(remainingTime). Please sign in again to avoid expiration in the middle of the transaction.\";"
% echo $line
"User session will expire in \(remainingTime). Please sign in again to avoid expiration in the middle of the transaction.";
% echo -E - $line
"User session will expire in \(remainingTime). Please sign in again to avoid expiration in the middle of the transaction.";
% val="$(echo -E - $line | cut -d";" -f1 | cut -d"=" -f2-)"
% echo $val
"User session will expire in \(remainingTime). Please sign in again to avoid expiration in the middle of the transaction."
% echo -E - "${val}"
"User session will expire in \(remainingTime). Please sign in again to avoid expiration in the middle of the transaction."

Скрипт (НЕ работает должным образом):

while read line; do
    if [[ $(echo $line | grep -c "=") -gt 0 ]]; then
        key="$(echo $line | cut -d";" -f1 | cut -d"=" -f1 | tr -d " ")"
        val="$(echo -E - $line | cut -d";" -f1 | cut -d"=" -f2-)"
/* !!--> */ [[ $IS_VERBOSE == "TRUE" ]] && echo "key: $key" && echo -E - "value: ${val}"                
/* !!--> */ [[ $key != "" && "${val}" != "" ]] && LOCALIZED_PAIR[$key]="${val}"
    fi
done < $LOCALIZED_DICT   # <-- This is an URI for .strings file

Строки, отмеченные знаком «!! -> "выводятся в оболочку и в файл без ключа sla sh ...

:« session_will_expire_message »

value:« Сеанс пользователя истекает через ( Остающееся время). Пожалуйста, войдите снова, чтобы избежать истечения срока в середине транзакции. "

Почему мой скрипт работает иначе и как это исправить?

РЕДАКТИРОВАТЬ:

Кажется, что sla sh вырезается из-за while l oop:

% while read l; do echo $l; done < ~/Desktop/tmpOutput 
"User session will expire in (remainingTime). Please sign in again to avoid expiration in the middle of the transaction.";

Если слэши разделяются, когда while l oop читает строку, есть ли способ избежать этого?

1 Ответ

1 голос
/ 26 мая 2020

У вас много лишних лишних процессов. Однако, помимо этого, используйте параметр -r, чтобы предотвратить обработку read любых обратных косых черт во входных данных.

while IFS== read -r key val; do
    [[ -z $key || -z $val ]] && continue
    if [[ $IS_VERBOSE == TRUE ]]; then
        print -r "key: $key"
        print -r "value: $val"
    fi
    LOCALIZED_PAIR[$key]=$val
done < "$LOCALIZED_DICT"
...