sed를 사용하여 변수를 다른 스크립트에 전달하는 것은 나쁜 습관입니까? [폐쇄]

sed를 사용하여 변수를 다른 스크립트에 전달하는 것은 나쁜 습관입니까? [폐쇄]

두 개의 쉘 스크립트가 있습니다.

그 중 하나가 소스 파일입니다.소스코드.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

스크립트 수정 대신 매개변수를 사용하도록 스크립트를 다시 작성할 수 있다면 그렇게 하십시오.

스크립트를 수정하려는 경우 몇 가지 법적 또는 준법적 상황이 있습니다.

  1. 스크립트에 명령줄에 전달하기에는 너무 많은 매개 변수가 있을 수 있습니다. 이 경우 다음과 같은 작업을 수행하는 것이 더 쉬울 것입니다.
sed -i "s/@PARAM1@/a/" main.sh
sed -i "s/@PARAM2@/b/" main.sh
...
sed -i "s/@PARAM99999@/zzzzzzzz/" main.sh

하지만 이 경우에는 이러한 매개변수를 구성 파일에 넣고 스크립트에서 읽는 것이 더 좋습니다.

  1. 스크립트는 더 큰 스크립트 세트의 일부일 수 있습니다. 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. 처음에 기본값을 설정한 후 매개변수를 사용하게 됩니다.

  1. 문제의 스크립트는 쉘 스크립트가 아닐 수 있으며 매개변수를 전혀 읽을 수 없습니다. 이는 일반적으로 스크립트 자체가 일부 도구(예: sqlplus또는 ) 에 입력될 때 발생합니다. 이는 "스크립트가 변경되고 있는" expect유일한 합법적인 상황 입니다.sed

답변2

명시적인 매개변수가 필요하지 않은 경우 환경 변수를 찾아볼 수 있습니다. 사용할 수 있는 것이 있으면 출력에 표시됩니다 env. 그렇지 않은 경우 사용자에게 새 설정을 설정하도록 요청할 수 있습니다.

기본 스크립트는 파일을 디렉터리에 저장하기 위해 사람의 이름이 필요합니다.

$HOME다음과 같은 변수 중 하나 인 것 같습니다 $XDG_*. https://specations.freedesktop.org/basedir-spec/basedir-spec-latest.html

관련 정보