두 개의 쉘 스크립트가 있습니다.
그 중 하나가 소스 파일입니다.소스코드.sh. 이 소스 파일은 여러 사람이 각자 자신의 디렉터리를 가지고 사용하게 됩니다.
name = "foo"
메인 스크립트메인 디렉토리대부분의 코드를 실행합니다. 변수를 전달해야 합니다 name
.
name = "foo"
sed -i "3i\\$name" /main.sh
/scripts/main.sh
sed -i '3d' /main.sh
이 코드 부분은 미리 작성되었습니다.
sed를 제거하고 다음과 같이 작성하는 것이 더 좋지 않을까요?
/scripts/main.sh "name"
?
이것은 또한 Bash의 첫 번째 프로젝트이므로 전문 지식이 제한되어 있습니다.
답변1
스크립트 수정 대신 매개변수를 사용하도록 스크립트를 다시 작성할 수 있다면 그렇게 하십시오.
스크립트를 수정하려는 경우 몇 가지 법적 또는 준법적 상황이 있습니다.
- 스크립트에 명령줄에 전달하기에는 너무 많은 매개 변수가 있을 수 있습니다. 이 경우 다음과 같은 작업을 수행하는 것이 더 쉬울 것입니다.
sed -i "s/@PARAM1@/a/" main.sh
sed -i "s/@PARAM2@/b/" main.sh
...
sed -i "s/@PARAM99999@/zzzzzzzz/" main.sh
하지만 이 경우에는 이러한 매개변수를 구성 파일에 넣고 스크립트에서 읽는 것이 더 좋습니다.
- 스크립트는 더 큰 스크립트 세트의 일부일 수 있습니다.
sed
동일한 하드코딩된 값을 공유해야 하는 여러 스크립트의 루프에서 호출될 수 있습니다. 이 접근 방식은 일반적으로 다양한 자동화 생성기 및/또는 빌드 시스템에서 사용됩니다.
하지만 이 경우 관련 스크립트는 일반적으로 이중 방식으로 수행됩니다. 즉, 일반적인 방식으로 매개변수를 읽지만 sed
기본값을 설정합니다. 그것은 다음과 같습니다:
#!/bin/bash
usage() {
echo "-a=N do something (default value @A@)"
echo "-b=ABC do something else (default value @B@)"
}
A=@A@
B=@B@
while getopts "a:b:" par; do
case $par in
a) A=$OPTARG
;;
b) B=$OPTARG
;;
*) usage
;;
esac
done
echo $A
echo $B
복잡한 애플리케이션에 이러한 스크립트가 여러 개 있는 경우 루프를 통해 모든 스크립트를 전달하는 것이 매우 편리할 수 있습니다 sed -i "s/@A@/somevalue" $script
. 처음에 기본값을 설정한 후 매개변수를 사용하게 됩니다.
- 문제의 스크립트는 쉘 스크립트가 아닐 수 있으며 매개변수를 전혀 읽을 수 없습니다. 이는 일반적으로 스크립트 자체가 일부 도구(예:
sqlplus
또는 ) 에 입력될 때 발생합니다. 이는 "스크립트가 변경되고 있는"expect
유일한 합법적인 상황 입니다.sed
답변2
명시적인 매개변수가 필요하지 않은 경우 환경 변수를 찾아볼 수 있습니다. 사용할 수 있는 것이 있으면 출력에 표시됩니다 env
. 그렇지 않은 경우 사용자에게 새 설정을 설정하도록 요청할 수 있습니다.
기본 스크립트는 파일을 디렉터리에 저장하기 위해 사람의 이름이 필요합니다.
$HOME
다음과 같은 변수 중 하나 인 것 같습니다 $XDG_*
.
https://specations.freedesktop.org/basedir-spec/basedir-spec-latest.html