명령을 추가하는 방법

명령을 추가하는 방법

쉘 스크립트에 명령을 첨부하는 방법을 기억하지 못합니다. 나는 검색했다추가의,다음에 추가,연결하다, 그리고 더 많은 것이 성공하지 못했습니다.

기본적으로 나는

belly = tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1))

if [ -z "${NUMBER+x}" ]; then # check if NUMBER exists
    tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1))
else
    tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) | cat -n
fi

잘 작동하지만 반복적인 논리가 마음에 들지 않습니다. 함수나 평가판을 사용할 수 있다는 것을 알고 있지만 이를 수행하는 더 쉬운 방법이 있습니까? 내 마음 속에는 다음과 같은 것이 있습니다.

belly = tail -n +$HEAD $1 | head -n $((TAIL-HEAD+1))

if [ -z "${NUMBER+x}" ]; then # check if NUMBER exists
    belly
else
    belly | cat -n
fi

그러나 이것은 작동하지 않습니다. 내가 무엇을 놓치고 있나요?

답변1

실제로 이 질문은 여기에서 답변되었을 수 있습니다.조건부 파이프라인

이 답변은 셸 if/then/else메커니즘을 사용하여 논리를 포함하는 데 사용합니다.~에관로. 연산자를 사용하여 이 작업을 수행할 수도 있지만 &&명확하게 읽히지 않으므로 을 선호합니다 if.

기본적으로 귀하의 경우 tail행은 다음과 같습니다( -z변경 사항 도 참고하세요 -n).

tail -n +"$HEAD" "$1" |
head -n $((TAIL-HEAD+1)) |
if [ -n "${NUMBER+x}" ]; then cat -n; else cat; fi

(여기에는 몇 가지 버그가 있을 수 있습니다. 저는 Linux 쉘 프로그래밍을 별로 좋아하지 않습니다. 하지만 여러분은 이해하실 것입니다.)

답변2

한 가지 옵션은 파이프라인의 변경 부분을 관리하기 위해 변수를 설정하는 것입니다. 변경되는 유일한 부분이 명령줄 매개변수인 경우 구현은 간단합니다.

cat_arg=""
if [ -n "${NUMBER+x}" ]; then
    cat_arg="-n"
fi    
somepipeline ... | cat $cat_arg

하지만 파이프의 마지막 부분을 완전히 제거하는 것은 어려울 것이므로 고양이를 아무 것도 사용하지 않을 것입니다. 그러나 그것은 아마도 중요하지 않을 것입니다. 또한 상황에 따라아니요변경된 인수에서 공백이나 전역 문자를 사용할 수 없도록 변수를 인용합니다.

따라서 배열이 더 좋을 것입니다.

final=(cat) 
if [ -n "${NUMBER+x}" ]; then
    final=(cat -n)
fi    
somepipeline ... | "${final[@]}" 

또는 두 개의 함수를 만들고 변수를 통해 그 중 하나를 호출할 수 있습니다.

그건 그렇고, 쉘 함수는 다른 질문에 대한 답이기도 합니다.

# define the function
belly() {
    tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1))
}
if ... ; then
    belly "$1" | this
else 
    belly "$1" | that
fi

$1함수에는 자체 위치 인수 컨텍스트가 있으므로 명시적으로 전달 해야 합니다 .

답변3

기본적으로 달성하려는 작업은 상태에 따라 -n옵션을 전달하거나 전달하지 않는 것입니다.cat$NUMBER

이렇게 하세요:

tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) | cat ${NUMBER:+'-n'}

UUOC 시나리오를 취소할 수도 있습니다.

eval "tail -n +\"$HEAD\" \"\$1\" | head -n \$((TAIL-HEAD+1)) ${NUMBER:+|cat -n}"

관련 정보