쉘 스크립트에 명령을 첨부하는 방법을 기억하지 못합니다. 나는 검색했다추가의,다음에 추가,연결하다, 그리고 더 많은 것이 성공하지 못했습니다.
기본적으로 나는
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}"