Wierzę, że robi to, co chcesz. Umieści wszystkie argumenty w jednym ciągu, oddzielone spacjami, z pojedynczymi cudzysłowami wokół wszystkich:
str="'$*'"
$*
tworzy wszystkie argumenty skryptów oddzielone pierwszym znakiem $IFS
, którego domyślnie jest spacja.
Wewnątrz ciągu podwójnego cudzysłowu nie ma potrzeby unikania pojedynczych cudzysłowów.
Przykład
Umieśćmy powyższe w pliku skryptu:
$ cat script.sh
#!/bin/sh
str="'$*'"
echo "$str"
Teraz uruchom skrypt z przykładowymi argumentami:
$ sh script.sh one two three four 5
'one two three four 5'
Ten skrypt to POSIX. Będzie działać, bash
ale nie wymaga bash
.
Odmiana: łączenie z ukośnikami zamiast spacji
Możemy zmienić spacje na inną postać, dostosowując IFS
:
$ cat script.sh
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old
Na przykład:
$ sh script.sh one two three four
'one/two/three/four'
cd "$*"
będzie wystarczająco dobry.cdm(){ str="$*"; cd "$str"; }
albo, jak sugeruje Scottcdm(){ cd "$*"; }
. Należy również pamiętać, że$*
zastępuje wiele kolejnych spacji jedną spacją. Jeśli nazwa katalogu może zawierać wiele następujących po sobie spacji, tabulatorów lub znaków nowej linii, znaki te naprawdę muszą być poprzedzone znakiem ucieczki przed przekazaniem ich docdm
funkcji.cdm
na przykład:cdm 'test 2 trial 1'
. To obsłuży cały dwór o dziwnych nazwach. Jednak dopóki białe spacje są ograniczone do pojedynczych spacji, wówczascdm
można go uruchomić jakocdm test 2 trial 1
.To łatwiejsze niż myślisz:
chmod + x that i uruchom go:
źródło