Shell parametre değişkenlerini ($ 1,…, $ @) doğrudan CLI'de kullanmak mümkün müdür?


9

Bazen yukarıdaki değişkenleri küçük örneklerle taklit etmek ve doğrulamak gerekir ve daha sonra hemen bazı komut dosyalarına vb. Kopyalanabilir.

Aşağıdaki şekillerde basit bir örnek kullanarak çözmeye çalıştım:

(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh

ve diğer kombinasyonlarla. Ayrıca shebang yorumlayıcı yönergesi ekleyerek deney #!/bin/sh -x, ancak istenen sonucu alamadım.

Bunu basitçe yapabilir miyim?


1
(find $1) /tmpbir sözdizimi hatasıdır. Aslında (any-command) more-argumentsbir sözdizimi hatasıdır. Ne yapmaya çalıştığınızı farklı açıklayabilir misiniz?
Celada

2
@Celada, bunun kabuklarda bir sözdizimi hatası değil rcailesi ( rc, es, akanga...), nerede eşdeğer olduğunu durumda find $1 /tmp.
Stéphane Chazelas

Yanıtlar:


15

Sonra ilk argüman sh -c inline-scriptgider $0(hata mesajları için de kullanılır) ve geri kalanı içeri girer $1, $2...

$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg

Yani istediğiniz:

sh -c 'find "$1"' sh /tmp

(eski günlerde, shilk argümanın devreye girdiği uygulamalar bulabilirdiniz $1, böylece şunları yapabilirsiniz:

sh -c 'find "$1"' /tmp /tmp

Veya:

sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2

ancak bu mermiler POSIX'in yaygın ve halka açık olduğu için artık yok oldu).


Eğer sette istiyorsanız $1, $2siz işlevlerini kullanmak istiyorum nerede şimdiki kabuğun içinde yerel bir kapsamda, bu. Bourne benzeri mermilerde:

my_func() {
  find "$1"
}
my_func /tmp

Bazı mermiler anonim işlevleri destekler. Durum böyle zsh:

(){find "$1"} /tmp

Veya es:

@{find $1} /tmp

Mevcut konum parametrelerini kalıcı olarak değiştirmek için sözdizimi kabuğa bağlıdır. dchirikov zaten Bourne gibi kabuklarına kapsamış (Bourne, Korn, bash, zsh, POSIX, ash, yash...).

Sözdizimi:

set arg1 arg2 ... argn

Ancak, şunlara ihtiyacınız vardır:

set --

Bu listeyi boşaltmak (veya shift "$#") ve

set -- -foo

veya $1ile başlayan bir şeye ayarlamak için , özellikle konumsal parametre listesinin sonuna argüman eklemek gibi rastgele veriler kullanırken her zaman kullanmak iyi bir alışkanlıktır .-+set --set -- "$@" other-arg

cshAilenin kabuklarında ( csh, tcsh) argvdiziye atarsınız :

set argv=(arg1 arg2)

Kabuklarında rcailesi ( rc, es, akanga), için *diziden:

*=(arg1 arg2)

Öğeleri ayrı ayrı da atayabilirsiniz:

2=arg2

İçinde fish, konum parametreleri sadeceargv dizidedir (hayır , orada):$1$@

set argv arg1 arg2

İle zshuyumluluk cshiçin argvdiziye de atayabilirsiniz :

argv=(arg1 arg2)
argv[4]=arg4

Ayrıca şunları da yapabilirsiniz:

5=arg5

Bu, aşağıdakileri de yapabileceğiniz anlamına gelir:

argv+=(another-arg)

sonuna bir argüman eklemek için ve:

argv[-1]=()
argv[2]=()

diğer kabuklarla kolayca yapamayacağınız bir argümanı uçtan veya ortadan kaldırmak için.


7
set --

ihtiyacınız olan şey:

$ set -- aaa bbb ccc
$ echo "$1"
aaa
$ echo "$2"
bbb
$ echo "$3"
ccc
$ echo "$@"
aaa bbb ccc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.