명령의 출력을 루프의 동일한 명령에 대한 입력으로 사용

명령의 출력을 루프의 동일한 명령에 대한 입력으로 사용

그래서 본질적으로 명령을 실행하는 bash/셸 스크립트용 템플릿을 찾으려고 합니다. 입력 "X"를 사용하여 "command1"이라고 부르고 그 자체에서 command1의 출력을 사용합니다... 하지만 루프에서 .

실제 사례는 다음과 같습니다.

echo "hello" | cut -c2-

그러면 입력 문자열과 출력의 시작 부분에서 첫 번째 문자가 제거됩니다.

ello

이제 위의 내용은 위에서 언급한 템플릿을 설명하기 위한 예일 뿐입니다. 이 예에 따르면 어떻게 사용합니까?명령 1산출:

echo "hello" | cut -c2-

그러나 입력으로서 루프에서는 무한히 반복되거나 바이트/문자가 하나만 남을 때까지 반복됩니다.

이렇게 하면 출력을 복사/붙여넣고 이전 입력으로 바꿀 필요가 없습니다.

echo "ello" | cut -c2-

또는 여러 파이프를 사용해야 하므로 너무 느리거나 비효율적입니다.

더 간단한 설명

수동 작업을 사용하면 이는 나(사용자)가 예제로 제공한 명령의 출력(또는 앞에서 설명한 의사 코드)을 복사하여 붙여넣고 이를 동일한 명령에 대한 입력으로 사용하고 남을 때까지 동일한 작업을 반복하는 것을 대체합니다." A " 바이트 또는 문자.

답변1

내가 올바르게 이해했다면 다음과 같은 것을 찾고 있습니다.

$ var=hello
$ while [ -n "$var" ]; do 
    printf -- "Var is now '%s'\n" "$var"
    var=$(printf -- '%s\n' "$var" | cut -c2-); 
done
Var is now 'hello'
Var is now 'ello'
Var is now 'llo'
Var is now 'lo'
Var is now 'o'

답변2

이건 효과가 있어리눅스에서:

echo hello | tee /dev/fd/0
hello
hello
hello
...

echo hello | gawk '!length{exit(0)} {print; print substr($0,2) >"/dev/fd/3"; fflush()}' 3>/dev/fd/0
hello
ello
llo
lo
o

이는 Linux에서 모든 파이프가 실제로 이름이 지정된 파이프라는 사실을 활용합니다(즉, 경로로 열 수 있음). 일반 명명된 파이프를 사용하여 다른 Unix 시스템에서도 작동합니다. 이 내용을 참조하세요.답변스택오버플로우에서.

답변3

재귀를 사용하여 이 작업을 수행할 수 있습니다.

command1() {
  local var
  IFS= read -r var
  if [[ $var ]]; then
    printf '%s\n' "$var"
    cut -c2- <<< "$var" | "${FUNCNAME[0]}"
  fi
}

그 다음에:

$ echo hello | command1
hello
ello
llo
lo
o

답변4

이것은 작동하는 것 같습니다:

foo() { [[ ! "${#1}" -eq 1 ]] && printf "%s" "$1" | cut -c2-; }

bar="hello"

while [[ ! -z $(foo "$bar") ]]; do bar=$(foo "$bar"); printf "%s\n" "$bar"; done

ello
llo
lo
o

관련 정보