하나의 스크립트를 다른 스크립트로 구성

하나의 스크립트를 다른 스크립트로 구성

다음을 수행하는 스크립트가 있는 경우

    [alice]$ math
    Enter a number: 5

    Number squared: 25
    Number divided: 1
    Number to power of 3: 125

수학 스크립트의 출력을 테이블로 구성하지만 여러 인수를 사용하고 "제수"를 표시하지 않는 다른 스크립트를 작성하고 싶습니다. 예를 들어

   [alice]$ newprogram 5 10

   *
   *Number    squared    power of 3
    5         25         125
    10        100        1000     

또한 수학 스크립트는 /home/alice새 프로그램이 위치할 에 있습니다 /home/user. 이 문제를 어떻게 처리해야 합니까?

답변1

날 봐답변기존 스크립트에 매개변수를 전달하는 방법에 대한 자세한 내용은 이전 질문을 참조하세요. 이 출력을 구문 분석하는 것은 이전 출력보다 더 어려울 것입니다.

새 버전을 스크립팅하는 것이 훨씬 간단합니다. 이와 같이 넌센스를 구문 분석하는 것은 주요 PITA입니다.

다음은 관련 없는 출력(예: 헤더)을 인쇄하는 원래 오류를 반복하지 않고 이를 수행하는 버전입니다.

#! /bin/bash

for i in "$@" ;  do
   printf "%i\t%i\t%i\n" $i $(($i * $i)) $(($i * $i *$i))
done

-v다음은 (verbose) 옵션을 사용하는 경우 선택적으로 제목을 인쇄하는 버전입니다.

#! /bin/bash

verbose=0

while getopts "v" opt ; do
  case "$opt" in
      v) verbose=1 ;;
   esac
done

shift "$((OPTIND-1))"

[ "$verbose" = "1" ] && printf "%s\t%s\t%s\n" 'Number' 'Squared' 'Power of 3'

for i in "$@" ;  do
   printf "%i\t%i\t%i\n" $i $(($i * $i)) $(($i * $i *$i))
done

답변2

질문에서 "방법"이라는 단어를 사용하고 있는데, 이는 주어진 대답이 "거친" 또는 다소 "일반적인" 것임을 의미하므로 이 문제를 해결하는 데 사용할 수 있는 다음 단계를 설명합니다.

  • 쓰다예상되는- 스크립트다투다로 전송됩니다 /home/alice/math.
  • /home/user/newprogram주어진 BASH 스크립트의 인수를 사용하여 루프에서 Expect 스크립트를 호출하는 BASH 스크립트(예: ) 작성명령 대체출력을 캡처합니다.
  • grep필요한 데이터를 추출하고 변수에 저장하는 등 즐겨 사용하는 텍스트 처리 도구를 사용합니다 (이를 위해서는 캡처된 출력을 로 파이프해야 하며 grep, 다시 명령 대체를 사용하여 명령으로 전달된 데이터를 캡처 grep하고 저장 위치에 저장해야 합니다). 변하기 쉬운).
  • 이 단계 이전 단계에서 구문 분석한 변수를 테이블로 출력합니다.

이 단계에서는 pair 가 있다고 가정합니다 /home/alice/math. 물론 그렇지 않은 경우 다음과 같이 할 수 있습니다.

  • /home/alice/mathchmod권한이나 소유자 만 사용 하거나 변경하세요 chown.
  • 두 사용자가 모두 액세스할 수 있도록 충분한 권한이 있는 공개 그룹에 alice을 배치합니다 .user/home/alice/math

관련 정보