스크립트에 사용되는 변수는 어떻게 설정하나요? 전역/시스템 전체일 필요는 없으며 현재 세션이면 충분합니다. 그런데 어떤 이유에서인지 현재 터미널에서 직접 스크립트를 실행해도 사라지는 것 같습니다.
예:
foo=bar
echo "$foo"
산출:bar
그러나 test.sh가 포함되어 있고 echo "$foo"
다음을 수행하는 경우:
foo=bar
./test.sh
출력이 비어 있습니다. 터미널 세션을 사용하여 동일한 세션에서 스크립트를 실행할 때 유효한 임시 변수의 범위를 설정하려면 어떻게 해야 합니까?
답변1
export foo=bar
환경 변수를 foo
string 으로 설정합니다 bar
. 단일 명령을 사용하여 for를 foo=bar ./test.sh
설정할 수도 있습니다 ( 즉, 로컬 셸 세션에서 변수를 설정하지 않음).foo
bar
test.sh
답변2
셸 스크립트를 실행하면 새 셸 인스턴스에서 실행되며 대화형 셸 인스턴스에서 인스턴스화된 변수를 상속하지 않습니다.
이런 방식으로 상속될 수 있는 특정 변수를 환경 변수라고 합니다. export
예를 들어 환경 변수에 변수를 할당할 수 있습니다 export foo=bar
. 이것은 bash 구문이며, 다른 쉘에서 사용할 수 있거나 env
다른 방법을 사용할 수 있습니다.
동일한 쉘 인스턴스 내에서 실행하기 위해 쉘 스크립트를 "소스"할 수도 있습니다. . test.sh
(마침표 참고) 또는 를 사용하여 이 작업을 수행 할 수 있습니다 source test.sh
. 대화형 세션이나 셸 스크립트에서 이 작업을 수행할 수 있습니다. 이는 외부 파일에서 일련의 쉘 함수 또는 변수 정의를 얻을 수 있는 쉘 "라이브러리"를 생성하는 데 매우 편리합니다. 매우 편리합니다.
예를 들어:
#!/bin/bash
. /path/lib.sh
echo $foo # foo is instantiated in lib.sh
do_something # this is a shell function from lib.sh
lib.sh는 다음과 같습니다.
foo="bar"
do_something() {
echo "I am do_something"
}
답변3
또 다른 옵션은 변수를 스크립트에 매개변수로 전달하는 것입니다.
foo=bar
./test.sh $foo
그러면 문제는 ./test.sh의 내용이 됩니다.
echo $1
대체되어야 합니다 echo $foo
. $1은 스크립트에 전달된 첫 번째 인수를 나타냅니다.
답변4
동일한 셸에서 할당 및 에코 테스트 스크립트를 실행할 수 있습니다.
root@ijaz-HP-EliteBook-8560p:~# export foo=bar
root@ijaz-HP-EliteBook-8560p:~# cat test.sh
#!/bin/bash
echo "$foo"
root@ijaz-HP-EliteBook-8560p:~# ./test.sh
bar
이것은 단지 한 가지 방법일 뿐입니다.