Mam polecenie rsync z następującymi parametrami:
rsync -avz --{partial,stats,delete,exclude=".*"}
Chcę umieścić te parametry w zmiennej, aby użyć jej później w skrypcie. Coś takiego:
#!/bin/bash
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
$VAR /dir1 /dir2
Próbowałem z cudzysłowami, pojedynczymi cudzysłowami, nawiasami kwadratowymi, bez powodzenia.
bash
shell-script
Kellyson
źródło
źródło
Odpowiedzi:
Umieszczenie złożonego polecenia w zmiennej nigdy nie jest zalecanym podejściem. Zobacz BashFAQ / 050 - Próbuję umieścić polecenie w zmiennej, ale złożone przypadki zawsze zawodzą!
Twoje wymaganie staje się naprawdę proste, jeśli zdecydujesz się użyć funkcji zamiast zmiennej i przekazać do niej argumenty.
Coś jak
i teraz przekaż mu wymagane argumenty jako
Definicja funkcji jest dość prosta, najpierw sprawdzamy liczbę argumentów wejściowych za pomocą zmiennej,
$#
która nie powinna wynosić zero. Zgłaszamy komunikat o błędzie informujący, że nie podano argumentów. Jeśli istnieją poprawne argumenty,"$@"
reprezentują rzeczywiste argumenty dostarczone do funkcji.Jeśli jest to funkcja można byłoby dość często korzystam z IE w skryptach wiersza polecenia / także dodać go do powłoki Startup-plików
.bashrc
,.bash_profile
na przykład.Lub, jak wspomniano, warto rozwinąć rozwinięcie nawiasu klamrowego do oddzielnych argumentów dla lepszej czytelności jako
źródło
Ten próbuje uruchomić polecenie
-avz
z argumentami--partial
,--stats
etc .. iVAR
zestaw dorsync
w środowisku.Cytowany formularz nie działa, ponieważ nawiasy klamrowe nie są rozwijane w cudzysłowach, a nie w przydziałach, ani też nie są rozwijane po rozwinięciu zmiennej.
Jeśli chcesz przechowywać argumenty wiersza poleceń w zmiennej, użyj tablicy:
Teraz
"${args[@]}"
będzie rozwijać sięrsync
,-avz
,--partial
, itd. Jako odrębnych słów.Tablice umożliwiają także dołączanie opcji do listy, w razie potrzeby warunkowo, dzięki czemu można np .:
źródło
Możesz przynajmniej zapisać opcje częściowo w zmiennej:
Testowanie jest ważne, ponieważ maskowanie może być trudne:
Ponieważ istnieje wiele alternatyw, takich jak użycie historii, użycie aliasu, użycie funkcji, nie ma oczywistego przypadku użycia, o którym mogę myśleć. Rzadko zdarza się skomplikowana opcja udostępniania między różnymi programami, więc dla rozwiązania ad-hoc dla interaktywnej powłoki aliasing wydaje się lepszym sposobem:
Twoja próbka
nie może działać, ponieważ przydział jest endet przy pierwszym pustym polu. Musisz zamaskować puste miejsca:
dość niebezpieczna rzecz do testowania, z tą opcją - usuń, prawda? Ponieważ opcje mogą ponownie zawierać „,” i pojedyncze cudzysłowy, maskowanie może wkrótce stać się trudne. Wybrałbym alias lub polegał na historii.
Alias może być przechowywany w pliku ~ / .bashrc do ciągłego używania przez wiele sesji. Funkcje mogą być również przechowywane w bashrc, ale potrzebujesz ich tylko, jeśli chcesz obsłużyć parametry, przekazane do funkcji, która będzie w nich oceniana.
źródło