Krótka odpowiedź: patrz BashFAQ # 50 („Próbuję umieścić polecenie w zmiennej, ale złożone przypadki zawsze zawodzą!”).
Długa odpowiedź: Umieszczanie poleceń (lub ich części) w zmiennych, a następnie przywracanie ich w stanie nienaruszonym jest skomplikowane. Gdy powłoka rozwija zmienną w wierszu poleceń, jeśli zmienna była w cudzysłowie, nie jest analizowana; jeśli nie było w cudzysłowach, spacje są analizowane jako łamanie argumentów, ale cudzysłowy i znak ucieczki nie są analizowane. W obu przypadkach umieszczanie cudzysłowów w wartości zmiennej nic nie robi.
Zwykle najlepszym sposobem na zrobienie tego rodzaju rzeczy jest użycie tablicy zamiast prostej zmiennej tekstowej:
echonie pokazuje tego, co myślisz. Spróbuj printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"dowiedzieć się, dlaczego żadna z tych opcji nie działa.
Odpowiedzi:
Krótka odpowiedź: patrz BashFAQ # 50 („Próbuję umieścić polecenie w zmiennej, ale złożone przypadki zawsze zawodzą!”).
Długa odpowiedź: Umieszczanie poleceń (lub ich części) w zmiennych, a następnie przywracanie ich w stanie nienaruszonym jest skomplikowane. Gdy powłoka rozwija zmienną w wierszu poleceń, jeśli zmienna była w cudzysłowie, nie jest analizowana; jeśli nie było w cudzysłowach, spacje są analizowane jako łamanie argumentów, ale cudzysłowy i znak ucieczki nie są analizowane. W obu przypadkach umieszczanie cudzysłowów w wartości zmiennej nic nie robi.
Zwykle najlepszym sposobem na zrobienie tego rodzaju rzeczy jest użycie tablicy zamiast prostej zmiennej tekstowej:
źródło
eval to kolejna opcja:
Zobacz też:
źródło
Nie widzę problemu:
Może trzeba jeszcze raz podać wartość:
źródło
echo
nie pokazuje tego, co myślisz. Spróbujprintargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"
dowiedzieć się, dlaczego żadna z tych opcji nie działa.