сохранение обратной косой черты-новой строки в heredocs запускается в подоболочке

Пробовали ли вы создать массив переменных со всеми вашими каталогами, а затем заставить цикл for выполнять команды для каждого из них? Убедитесь, что вы используете полный путь к каждому каталогу в переменной.

#!/bin/bash
#
#
#
DIR1="/tmp/testdir1/"
DIR2="/tmp/testdir1/nestdir1/"
DIR3="/tmp/testdir2/"
DIR4="/tmp/testdir2/nestdir2/"
DIR5="/tmp/testdir3/"
DIR6="/tmp/testdir3/nestdir3/"
declare -a DIRECTORIES=("$DIR1" "$DIR2" "$DIR3" "$DIR4" "$DIR5" "$DIR6")
for DIR in "${DIRECTORIES[@]}"; do
    cd "$DIR"
    touch testfile
done
2
06.08.2019, 04:08
2 ответа

Интересно, это ошибка в Bash (или поведение обратной косой черты -новой строки просто не определено ). Все другие оболочки, которые я пробовал, ведут себя иначе, чем Bash:

$ cat nl.sh

echo "1:"
cat <<EOF
a \\
b \\
c
EOF

echo "2:"
var=$(cat <<-EOF
a \\
b \\
c
EOF
)
echo "$var"

выход:

$ bash nl.sh
1:
a \
b \
c
2:
a \b \c

против

$ dash nl.sh
1:
a \
b \
c
2:
a \
b \
c

Вы можете поместить код внутри подстановки команд в функцию, которая может помочь в решении любых проблем с синтаксическим анализатором, например.:

f() {
cat <<EOF
a \\
b
EOF
}
var=$(f)
echo "$var"
1
27.01.2020, 22:08

Не существует прямого способа заставить новый символ строки -быть принудительно развернутым внутри документа здесь -. Но вы можете использовать переменную, содержащую закодированный символ новой строки, используя управляющую последовательность ANSI ($'\n'), и сделать раскрытие переменной внутри heredoc.

Обратите внимание, что эта форма расширения hereodoc потребует, чтобы ваш de -ограничитель 'EOF'не был заключен в кавычки, т.е. что-то вроде ниже,

nl=$'\n'

и используйте переменную $nlв качестве заполнителя для символа новой строки

var=$(cat <<-EOF
a $nl
b $nl
c
EOF
)

, который теперь корректно излучает

echo "$var"
a 

b 

c
1
27.01.2020, 22:08

Теги

Похожие вопросы