Припустимо, у мене є main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
та в install.sh:
echo $1
Це, мабуть, перегукується "a string"
, але нічого не перегукується. Чому?
Припустимо, у мене є main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
та в install.sh:
echo $1
Це, мабуть, перегукується "a string"
, але нічого не перегукується. Чому?
Відповіді:
Майкл Мрозек висвітлює більшість питань, і його виправлення працюватимуть, оскільки ви використовуєте Bash.
Можливо, вас зацікавить той факт, що можливість джерела сценарію з аргументами - це башізм. В sh
або dash
вашої main.sh
волі не відлуння нічого , тому що аргументи в лічений сценарій ігноруються і $1
буде посилатися на аргументmain.sh.
Коли ви джерело скрипту в sh
, це як би ви просто копіюєте і вставляєте текст вивіреного сценарію у файл, з якого він отриманий. Розглянемо наступне (зверніть увагу, я вніс виправлення, рекомендовані Майклом):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
Я бачу три помилки:
Рядок призначення невірний:
$NAME="a string"
При призначенні змінної ви не включаєте $
; вона повинна бути:
NAME="a string"
Ви пропали then
; умовна лінія повинна бути:
if [ -f $HOME/install.sh ]; then
Ви не цитуєте $NAME
, хоча в ньому є пробіли. Рядок джерела повинен бути:
. $HOME/install.sh "$NAME"
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
; Я, мабуть, не повинен робити подібних дій, коли шукаю помилки
просто встановіть свої параметри перед тим, як отримати скрипт!
#!/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$
--
як вони були аргументами команд:set -- -v foo -l bar -j "${bin}"