Kaynak oluştururken değişkenleri bir bash betiğine iletme


18

Main.sh içinde var varsayalım:

$NAME="a string"
if [ -f $HOME/install.sh ]
    . $HOME/install.sh $NAME
fi

ve install.sh dosyasında:

echo $1

Bunun yankılanması gerekiyordu "a string", ama hiçbir şey yankılanmıyor. Neden?


2
Soruyu güncellemeyin lütfen. Bu şekilde ilk sorunuzda neyin yanlış olduğunu göremeyiz. Az önce geri aldım.
Valentin Bajrami

Yanıtlar:


20

Michael Mrozek sorunların çoğunu kapsar ve düzeltmeleri Bash kullandığınızdan beri çalışır.

Bir betiği argümanlarla kaynaklayabilmenin bir bashizm olmasıyla ilgilenebilirsiniz. Gelen shveya dashsizin main.shkaynaklı senaryoya argümanları göz ardı edilir çünkü irade değil bir şey yankı ve $1karşı argüman sevk edecektirmain.sh.

Komut dosyasını kaynak yaptığınızda, kaynak shkodun metnini kopyalandığı ve kaynaklandığı dosyaya yapıştırdığınız gibidir. Aşağıdakileri düşünün (not, Michael'ın önerdiği düzeltmeyi yaptım):

$ bash ./test.sh
A String
$ sh ./test.sh

$ sh ./test.sh "HELLO WORLD"
HELLO WORLD

"Sh veya dash'de main.sh hiçbir şey yankılanmayacaktır çünkü kaynaklı komut dosyasının argümanları yok sayılır ve $ 1 main.sh argümanına atıfta bulunur" Tam olarak olan budur. Cevabın için teşekkür ederim.
Biri hala size MS-DOS kullanan

Cevabınızı kabul edilmiş olarak işaretledim, çünkü asıl mesele senaryomdaki hatalarla değil, esas olarak sh ile bash eşitlendiğimden ve bash bu durumda sh taklit etmekte kötü bir iş çıkarıyor. Cevabınız bana bu konu hakkında bilgi verdi, teşekkürler;
Birisi hala MS-DOS

2
Teknik olarak, burada daha çok bir kshizm (zaten ksh86'da, muhtemelen daha önce). @ Birisi-DOS, "sh" belirtimi fazladan argümanlar iletirseniz ne olması gerektiğini söylemez, bu nedenle tire veya bash davranışı diğerinden daha fazla "sh" değildir ve eşit derecede geçerlidir.
Stéphane Chazelas

16

Üç hata görüyorum:

  1. Atama satırınız yanlış:

    $NAME="a string"

    Bir değişkene atadığınızda $; olmalı:

    NAME="a string"
  2. Kayboldun then; koşullu satır şöyle olmalıdır:

    if [ -f $HOME/install.sh ]; then
  3. $NAMEBoşlukları olmasına rağmen alıntı yapmıyorsunuz . Kaynak hattı şöyle olmalıdır:

    . $HOME/install.sh "$NAME"

Ayrıca birkaç hatası daha var, ancak bunun sorununun kaynağı olduğunu düşünmüyorum.
Steven D

@Steven Haklısın, bahsetmediğim birkaç tane daha vardı; Şu anda listelediğim düzeltmelerle benim için çalışıyor
Michael Mrozek

@Steven Denemek için senaryoyu bir araya getirirken kısalttım [ -f $HOME/install.sh ] && . $HOME/install.sh $NAME; Hata ararken muhtemelen böyle şeyler yapmamalıyım
Michael Mrozek

Özellikle BASH'den bahsettiği için aslında bir sorun olmadığını düşündüğüm diğer sorun gibi görünüyor.
Steven D

5

komut dosyasını kaynaklamadan önce parametrelerinizi ayarlamanız yeterlidir!

main.sh

#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
    set -- $NAME ;
    . install.sh ;
fi
exit;

install.sh

#!/bin/bash
echo  " i am sourced by [ ${0##*/} ]";
echo  " with [ $@ ] as parametr(s) ";
exit;

Ölçek

u@h$ ./main.sh some args
 i am sourced by [ main.sh ]
 with [ some args ] as parametr(s) 
u@h$

Bayrakları nasıl ayarlarsınız?
Jonathan Landrum

Düzenleme: görünüşe göre sadece --komut argümanları gibi onları sonra dize :set -- -v foo -l bar -j "${bin}"
Jonathan Landrum
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.