SORU
15 Ocak 2009, PERŞEMBE


Almak ve repass için Bash komut dosyası parametreleri alıntı

Güvenli bir şekilde iç içe geçmiş bir komut dosyası tarafından alınan bir bash script alıntı parametreleri almaya çalışıyorum. Herhangi bir fikir?

test.sh

#!/bin/bash
echo $*
bash myecho.sh $*

myecho.sh

#!/bin/bash
 echo $1
 echo $2
 echo $3
 echo $4

Örnek:

bash test.sh aaa bbb '"ccc ddd"'

Sonuç:

aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"

Sonuç istedi

aaa bbb "ccc ddd"
aaa
bbb
ccc ddd

CEVAP
21 EKİM 2010, PERŞEMBE


Kullanmak istediğiniz "$@" (alıntı dolar), alt parametreleri geçirmek için. Gibi...yani.

ls-color.sh:

#!/bin/bash
/bin/ls --color=auto "$@"    # passes though all CLI-args to 'ls'


Neden.....

Bash man page:

$* -- konumsal parametrelere birden başlayarak Genişler. Ne zaman genişleme, çift tırnak içinde, tek bir kelime için genişler oluşur her parametrenin ilk karakteri ile ayrılmış değer özel bir değişken EĞERLER. Bu eşdeğerdir "$*" EĞERLER değeri c ilk karakter olduğu "$1c$2c...", değişken. Eğer EĞERLER silme, parametreleri boşluk ile ayrılır. Eğer EĞERLER null, parametreleri aradaki ayracı katıldı.

$@ -- konumsal parametrelere birden başlayarak Genişler. Ne zaman genişleme çift tırnak içinde oluşur, her bir parametre için genişletir ayrı kelime. Bu İse "$1" "$2" ... eşdeğerdir "$@" çift tırnaklı bir kelime genişleme, genişleme içinde oluşur ilk parametre, orijinal başlangıç kısmı ile birleştirilir kelime, ve son parametre genişleme son ile katıldı. orijinal sözcüğü bir parçası. Konumsal parametreler vardır hiçbir zaman, "$@" $@ hiçbir şey için (yani, onlar kaldırılmış) genişletin.


Bazı demo komut dosyalarını ayarlama ...

echo 'echo -e "\$1=$1\n\$2=$2\n\$3=$3\n\$4=$4"' > echo-params.sh
echo './echo-params.sh $*' > dollar-star.sh
echo './echo-params.sh $@' > dollar-at.sh
echo './echo-params.sh "$*"' > quoted-dollar-star.sh
echo './echo-params.sh "$@"' > quoted-dollar-at.sh
chmod  x *.sh

"$@" - -alıntı dolar-birkimlik dönüşümüyeniden geçen bir elektron koparmak için argümanlar (~99%, bunu yapmak için ne demek olduğunu.

./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2=            
  # $3= 'cc cc'
  # $4= "ddd ddd"

"$*" - -alıntı dolar yıldızlıçökertildi tek bir dize içine argümanlar(~1% aslında bu davranış, bir koşullu örneğin: if [[ -z "$*" ]]; then ...):

./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa  'cc cc' "ddd ddd"   
  # $2=                     
  # $3=             
  # $4=

$* / $@ - tırnak işaretleri olmadan, her iki form şerit kapalı bir düzeyde tırnak ve yorumlamak alanların temel dizeler ama görmezden tırnak karakteri (neredeyse her zaman, bu bir hata):

./dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2= 'cc                  
  # $3= cc'
  # $4= "ddd

./dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2= 'cc
  # $3= cc'
  # $4= "ddd

Eğer biraz eğlenmek istiyorsanız, kullanabilirsiniz "$@" şey istediğin kadar derin yuva ve elemanları iterek haşhaş argümanlar eğer istersen yığını.

function identity() {
  "$@"
}
set -x
identity identity identity identity identity echo Hello \"World\"
#   identity identity identity identity identity echo Hello '"World"'
#   identity identity identity identity echo Hello '"World"'
#   identity identity identity echo Hello '"World"'
#   identity identity echo Hello '"World"'
#   identity echo Hello '"World"'
#   echo Hello '"World"'
# Hello "World"

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • expertvillage

    expertvillag

    5 NİSAN 2006
  • PlayStation

    PlayStation

    16 Aralık 2005