BASH - wywołanie skryptu z parametrami


(Kojot) #1

Chciałbym uruchomić skrypt BASHA z parametrami w ten sposób:

./skrypt parametr1:parametr2:parametr3

Znalazłem pewne rozwiązanie umieszczając w skrypcie modyfikacje zmiennej IFS na następującą:

IFS=':'

a następnie rozdzielając zmienną $1 poleceniem:

set $1

Wtedy parametr1 mam w $1, parametr2 w $2, a parametr3 w $3.

Jednak problem pojawia się, gdy przy wywoływaniu skryptu, któryś z parametrów zawiera w sobie spację. Wtedy już cały napis nie jest w zmiennej $1 i opisana powyżej metoda nie działa.

Czy jest jakiś sposób na zmuszenie shella do ignorowania tych spacji?

Interesuję mnie także czy jest możliwość scalenia zmiennych $1, $2, $3 , ... itd. w zmienną $1. Takie rozwiązanie też mnie satysfakcjonuje, bo mogę znowu wykorzystać powyższą metodę.

Być może są jeszcze jakieś inne sposoby. Czekam na propozycję i komentarze.

Z góry dzięki.


(roobal) #2

Większość parametrów w bashu składjących się z dwóch wyrazów najczęściej rozdzielana jest przy pomocy myślnika. W bashu np. katalogi zawierające nazwę ze spacjami obejmuje się w cudzysłów lub slash i backslash. Ode mnie to tyle, dalej kombinuj sam czy to zadziała.

Pozdrawiam!


(matiit) #3
+8:20% cat a.sh

#!/bin/bash

echo $1 ;

echo $2 ;


+8:20% ./a.sh tata\ marka samochod

tata marka

samochod

+8:20%

(Utrivv) #4

Po co scalać zmienne $1 $2 $3 skoro jest zmienna $*(wszystkie parametry)?


(Kojot) #5

Potrzebuję mieć w $1 pierwszy parametr, w $2 drugi parametr, a w $3 parametr, bo potem mogę je użyć do polecenia ftp.

Np. w pierwszym parametrze może być host, w drugim adres pliku zdalnego, w trzecim adres pliku lokalnego.


([alex]) #6

odpalaj skrypt:

./skrypt "parametr1:parametr2:parametr3"

wszystko będziesz miał w $1

lub użyj $* zamiast $1


(Kojot) #7

Założenie jest takie, że to złośliwy użytkownik odpali skrypt ze spacjami, ale nie użyje \ ani " ".


(Sawyer47) #8

A nie możesz sobie po prostu podzielić "$@" lub "$*" na grupy odseparowane dwukropkiem i zapisać do zmiennej tablicowej? Jeżeli już naprawdę musisz je mieć potem pod $1, $2... to chyba da się wartości z tablicy przypisać do kolejnych zmiennych... (sorry ża same przypusczenia, ale w bashu nie jestem dobry, wolę Perla :wink:)


(Kojot) #9

Wpadłem na pomysł, żeby załadować wszystkie zmienne do zmiennej $parametry w ten sposób:

parametry="$@"

następnie ustawić separator

IFS=':'

i wywołać jakąś funkcję z tą zmienną jako parametrem, np:

funkcja $parametry

Wtedy w nowej funkcji mam pod $1, $2, $3, ... odpowiednie zmienne rozdzielone w miejscach gdzie był dwukropek :wink:

Dzięki za odpowiedzi


([alex]) #10

Przecież dawno ci to proponowało kilka osób, z tym że nikt z nas nie wpadł na pomysł zapisywania do zmiennej raczej mnie i utrivv'owi chodziło o:

funkcja "$*"