Giả sử tôi có trong main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
và trong install.sh:
echo $1
Điều này được cho là vang "a string"
, nhưng nó không có gì. Tại sao?
Giả sử tôi có trong main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
và trong install.sh:
echo $1
Điều này được cho là vang "a string"
, nhưng nó không có gì. Tại sao?
Câu trả lời:
Michael Mrozek bao gồm hầu hết các vấn đề và các bản sửa lỗi của anh ấy sẽ hoạt động vì bạn đang sử dụng Bash.
Bạn có thể quan tâm đến thực tế rằng khả năng tìm kiếm một kịch bản với các đối số là một bashism. Trong sh
hoặc dash
của bạn main.sh
sẽ không lặp lại bất cứ điều gì vì các đối số cho tập lệnh có nguồn gốc bị bỏ qua và $1
sẽ đề cập đến đối số đểmain.sh.
Khi bạn nhập tập lệnh vào sh
, như thể bạn chỉ sao chép và dán văn bản của tập lệnh có nguồn gốc vào tập tin mà nó được lấy nguồn. Hãy xem xét những điều sau (lưu ý, tôi đã thực hiện chỉnh sửa mà Michael khuyến nghị):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
Tôi thấy ba lỗi:
Dòng bài tập của bạn sai:
$NAME="a string"
Khi bạn gán cho một biến bạn không bao gồm $
; nó nên là:
NAME="a string"
Bạn đang mất tích then
; dòng điều kiện nên là:
if [ -f $HOME/install.sh ]; then
Bạn không trích dẫn $NAME
, mặc dù nó có không gian. Dòng nguồn phải là:
. $HOME/install.sh "$NAME"
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
; Tôi có lẽ không nên làm những việc như vậy khi tôi đang tìm kiếm lỗi
chỉ cần đặt tham số của bạn trước khi tìm nguồn cung cấp tập lệnh!
#!/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$
--
giống như các đối số lệnh:set -- -v foo -l bar -j "${bin}"