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?
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?
Yanıtlar:
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 sh
veya dash
sizin main.sh
kaynaklı senaryoya argümanları göz ardı edilir çünkü irade değil bir şey yankı ve $1
karşı argüman sevk edecektirmain.sh.
Komut dosyasını kaynak yaptığınızda, kaynak sh
kodun 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
Üç hata görüyorum:
Atama satırınız yanlış:
$NAME="a string"
Bir değişkene atadığınızda $
; olmalı:
NAME="a string"
Kayboldun then
; koşullu satır şöyle olmalıdır:
if [ -f $HOME/install.sh ]; then
$NAME
Boşlukları olmasına rağmen alıntı yapmıyorsunuz . Kaynak hattı şöyle olmalıdır:
. $HOME/install.sh "$NAME"
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
; Hata ararken muhtemelen böyle şeyler yapmamalıyım
komut dosyasını kaynaklamadan önce parametrelerinizi ayarlamanız yeterlidir!
#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
set -- $NAME ;
. install.sh ;
fi
exit;
#!/bin/bash
echo " i am sourced by [ ${0##*/} ]";
echo " with [ $@ ] as parametr(s) ";
exit;
u@h$ ./main.sh some args
i am sourced by [ main.sh ]
with [ some args ] as parametr(s)
u@h$
--
komut argümanları gibi onları sonra dize :set -- -v foo -l bar -j "${bin}"