Misalkan saya ada di main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
dan di install.sh:
echo $1
Ini seharusnya bergema "a string"
, tetapi tidak ada gema. Mengapa?
Misalkan saya ada di main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
dan di install.sh:
echo $1
Ini seharusnya bergema "a string"
, tetapi tidak ada gema. Mengapa?
Jawaban:
Michael Mrozek mencakup sebagian besar masalah dan perbaikannya akan berhasil karena Anda menggunakan Bash.
Anda mungkin tertarik pada kenyataan bahwa kemampuan untuk sumber naskah dengan argumen adalah bashism. Dalam sh
atau dash
Anda main.sh
tidak akan menggemakan apa pun karena argumen ke skrip bersumber diabaikan dan $1
akan merujuk pada argumen untukmain.sh.
Ketika Anda sumber skrip sh
, seolah-olah Anda hanya menyalin dan menempelkan teks dari skrip bersumber ke file dari mana itu berasal. Pertimbangkan yang berikut ini (catatan, saya telah membuat koreksi yang direkomendasikan Michael):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
Saya melihat tiga kesalahan:
Baris tugas Anda salah:
$NAME="a string"
Saat Anda menetapkan variabel Anda tidak menyertakan $
; harus:
NAME="a string"
Kamu hilang then
; baris kondisional harus:
if [ -f $HOME/install.sh ]; then
Anda tidak mengutip $NAME
, meskipun memiliki spasi. Baris sumber harus:
. $HOME/install.sh "$NAME"
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
; Saya mungkin tidak boleh melakukan hal-hal seperti itu ketika saya mencari kesalahan
cukup atur parameter Anda sebelum mengambil skrip!
#!/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$
--
seperti mereka adalah argumen perintah:set -- -v foo -l bar -j "${bin}"