Muszę napisać złożony xml do zmiennej w skrypcie bash. Plik xml musi być czytelny w skrypcie bash, ponieważ tutaj będzie istniał fragment xml, nie będzie on odczytywany z innego pliku lub źródła.
Więc moje pytanie brzmi: jeśli mam długi ciąg, który chcę, aby był czytelny dla ludzi w moim skrypcie bash, jaki jest najlepszy sposób, aby to zrobić?
Idealnie chcę:
- aby nie musieć uciekać żadnej z postaci
- łamią się przez wiele linii, dzięki czemu są czytelne dla człowieka
- zachowaj wcięcie
Czy można to zrobić za pomocą EOF lub czegoś innego, czy ktoś mógłby dać mi przykład?
na przykład
String = <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
Odpowiedzi:
Spowoduje to umieszczenie tekstu w zmiennej bez konieczności uciekania się do cudzysłowów. Będzie również obsługiwał niezrównoważone cytaty (apostrofy, tj
'
.). Umieszczanie cudzysłowów wokół wartownika (EOF) zapobiega rozszerzaniu parametrów tekstu. Te-d''
przyczyny to czytać wiele wierszy (ignoruje znaki nowej linii).read
jest wbudowanym Bash, więc nie wymaga wywoływania zewnętrznego polecenia, takiego jakcat
.źródło
cat
.cat
to polecenie zewnętrzne. Nieużywanie go oszczędza to. Ponadto niektórzy mają filozofię, że jeśli używasz kota z mniej niż dwoma argumentami, „Ur robi to źle” (co różni się od „bezużytecznego użyciacat
”).set -e
. Wydaje się, żeread
zawsze zwraca wartość niezerową. Możesz! read -d .......
String
zmiennej do zapisu do pliku, umieść ją wokół „QUOTES”, np .echo "${String}" > /tmp/multiline_file.txt
Lubecho "${String}" | tee /tmp/multiline_file.txt
. Zajęło mi to ponad godzinę, żeby to znaleźć.Już prawie tam byłeś. Albo użyjesz cat do złożenia łańcucha, albo zacytujesz cały łańcuch (w takim przypadku będziesz musiał uciec z cudzysłowu w łańcuchu):
źródło
'EOF'
lub"EOF"
, w przeciwnym razie zmienne powłoki zostaną przeanalizowane.Powinno to działać dobrze w środowisku powłoki Bourne
źródło
Jeszcze inny sposób na zrobienie tego samego ...
Lubię używać zmiennych i specjalnych,
<<-
którzy upuszczają tabulację na początku każdej linii, aby umożliwić wcięcie skryptu:ostrzeżenie : nie ma puste miejsce przed
Kilka wyjaśnień:eof
, ale tylko zestawianiu ."${Pattern[*]}"
tę tablicę na ciąg.IFS=";"
ponieważ nie ma;
wymaganych ciągówwhile IFS=";" read file ...
zapobiegaIFS
modyfikacji w pozostałej części skryptu. W tymread
używaj tylko zmodyfikowanegoIFS
.źródło
mapfile
wymaga Bash 4 lub wyższej. A składnia"${Pattern[*]}"
rzutuje tablicę na ciąg znaków w cudzysłowach (jak pokazano w przykładowym kodzie).W wielu innych odpowiedziach jest zbyt wiele przypadków narożnych.
Aby mieć absolutną pewność, że nie ma problemów ze spacjami, tabulatorami, IFS itp., Lepszym podejściem jest użycie konstruktu „heredoc”, ale kodowanie zawartości heredoc przy użyciu,
uuencode
jak wyjaśniono tutaj:https://stackoverflow.com/questions/6896025/#11379627 .
źródło