Предположим, у меня есть в 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}"