Muszę połączyć dwie zmienne, aby utworzyć nazwę pliku z podkreśleniem. Wywołuje moje zmienne $FILENAME
i $EXTENSION
gdzie nazwa pliku jest odczytywana z pliku.
FILENAME=Hello
EXTENSION=WORLD.txt
Teraz...
Próbowałem następujących bez powodzenia:
NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION
Zawsze otrzymuję coś dziwnego. Zwykle podkreślenie jest pierwsze.
Muszę tak być
echo $NAME
Hello_WORLD.txt
bash
shell-script
Rhyuk
źródło
źródło
Odpowiedzi:
Możesz użyć czegoś takiego:
Działa to również:
źródło
echo
nie może pomóc. Drugie polecenie zostało już podane w pytaniu.Twój:
wszystko w porządku, więc byłoby:
(ale z pewnością nie
za używaNAME=$(echo ${FILENAME}_${EXTENSION})
echo
i operatora ).split+glob
byłby taki sam jak:
as
_
(w przeciwieństwie do\
lub'
) jest poprawnym znakiem w nazwie zmiennej.Problem polega na tym, że linie rozdzielane są za pomocą CRLF zamiast tylko LF, co oznacza, że te zmienne treści kończą się znakiem CR.
Znak CR po zapisaniu na terminalu informuje terminal, aby przesunął kursor na początek linii.
Hello<CR>_WORLD.TXT<CR>
Gdy więc zostanie wysłany do terminala, pokaże się jako_WORLD.TXT
(przesłaniającyHello
).źródło
Przełączyłem się na użycie
${FILENAME}_${EXTENSION}
wyżej wspomnianej składni.Kiedyś
$()
potrzebowałem, kiedy musiałem połączyć dwie zmienne z podkreśleniem. Na przykład,$YYYYMMDD$()_$HHMMSS
aby wygenerować nazwę pliku zawierającą znacznik czasu w formacie RRRRMMDD_GGMMSS. Środek$()
nic nie zwraca i dzieli dwie zmienne na części.Kiedyś mierzyłem
time
zadania przy użyciu$YYYYMMDD$()_$HHMMSS
metody i niektórych z powyższych, i wszyscy zgłosili 0ms na starym serwerze, na którym używam tego. Wydajność nie wydaje się być problemem.źródło
$()
rozwidla podpowłokę na kilka powłok (niektóre optymalizują ją). Przejmuje także porwanie operatora za coś, dla czego nie został zaprojektowany.${x}_y
jest tym czego chcesz.Powinieneś używać zmiennych małymi literami (jest to najlepsza praktyka).
Więc użyję nazwy pliku i rozszerzenia zamiast FILENAME i EXTENSION
Mówiąc, że „nazwa pliku jest odczytywana z pliku”, zakładam, że skrypt to:
I że chcesz połączyć obie zmienne $ filename i $ extension z podkreśleniem
_
.Podane przykłady (z wyjątkiem: brak podwójnego \) działają tutaj poprawnie:
Jak niektóre inne:
Twój problem nie polega na tym, jak zmienne są sklejone, ale na zawartości zmiennych. Wydaje się rozsądne sądzić, że to:
odczyta końcowy powrót karetki,
\r
jeśli będzie czytać z pliku Windows.Jednym prostym rozwiązaniem (dla ksh, bash, zsh) jest usunięcie wszystkich znaków kontrolnych ze zmiennej read:
Można to zasymulować za pomocą wartości, która ma znak powrotu karetki:
Lub zastępując wartość
filename
:Wniosek.
Więc to:
Otrzyma poprawną wartość,
name
nawet jeśli inne zmienne zawierają znaki kontrolne.źródło
Odpowiedź Stéphane'a Chazelasa ,
jest oczywiście najlepszą odpowiedzią i powinna być odpowiedzią przyjętą. Ale w duchu odpowiedzi użytkownika208145 oto alternatywa:
źródło
Możesz także użyć tego: oddziel oddzielne zmienne spacjami i połącz je za pomocą tr, aby usunąć spację.
źródło