Как удалить \ r с помощью IFS? - PullRequest
1 голос
/ 20 июня 2020

Я пишу фрагмент кода, как показано ниже:

while IFS=$': \r\t' read -r -u9 marker v; do
    case $marker in
        Release)
            export RELEASE=$v
            ;;
    esac
done 9< <(git show -s --format=%b)

Но я вижу, что $v все еще содержит \r. Из https://bash.cyberciti.biz/guide/ $ IFS, я прочитал A sequence of IFS whitespace characters is also treated as a delimiter. Разве то, что я сделал, не должно было удалить завершающие \r из строк?

Ответы [ 3 ]

2 голосов
/ 20 июня 2020

Поскольку вы форматируете вывод git show, используйте null разделитель %x00 в строке формата git, который никогда не может быть записан в переменную оболочки:

while IFS=$': \t' read -r -u9 marker v
do
  case $marker in
    Release)
      export RELEASE="$v"
      ;;
  esac
done 9< <( git show -s --format='%b%x00' )
0 голосов
/ 23 июня 2020

Я использовал tr, чтобы удалить завершающий \r. Это было мое окончательное решение:

while IFS=$': \r\t' read -r -u9 marker v; do
    case $marker in
        Release)
            export RELEASE=$(echo $v | tr -d '\r\t')
            ;;
    esac
done 9< <(git show -s --format=%b)
0 голосов
/ 20 июня 2020

Вы можете изменить read следующим образом:

read -r -u9 marker v possibly_something_else;

, чтобы $ v не содержал \ r

...