コマンドの出力をループ内の同じコマンドへの入力として使用する

コマンドの出力をループ内の同じコマンドへの入力として使用する

そのため、基本的にコマンドを実行するbash /シェルスクリプト用のテンプレートを見つけようとします。入力「X」を使用して「command1」と呼び、それ自体でcommand1の出力を使用します...しかし、ループ内で。

実際のケースは次のとおりです。

echo "hello" | cut -c2-

これにより、入力文字列と出力の先頭から最初の文字が削除されます。

ello

上記は、上記のテンプレートを説明するための例です。この例では、どのように使用しますか?コマンド1出力:

echo "hello" | cut -c2-

ただし、入力としてループは無限に繰り返されるか、バイト/文字が1つだけ残るまで繰り返されます。

これにより、出力をコピー/貼り付けて前の入力に置き換える必要がなくなります。

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

これは効果がありますLinuxで:

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

関連情報