Nor*_*tfi 1 bash shell-script template
因此,我正在尝试为 bash/shell 脚本找到一个基本上运行命令的模板,让我们使用输入“X”将其称为“command1”,然后在其自身上使用 command1 的输出......但在循环中。
这是一个真实世界的例子:
echo "hello" | cut -c2-
Run Code Online (Sandbox Code Playgroud)
这将删除输入字符串开头的第一个字符并输出:
ello
Run Code Online (Sandbox Code Playgroud)
现在,上面只是一个例子来说明上面提到的模板。按照这个例子,我如何使用command1输出:
echo "hello" | cut -c2-
Run Code Online (Sandbox Code Playgroud)
但是作为输入,在循环中,要么无限循环,要么直到只剩下一个字节/字符。
这样我就不需要复制/粘贴输出并将其替换为旧输入:
echo "ello" | cut -c2-
Run Code Online (Sandbox Code Playgroud)
或者需要使用多个管道,这会太慢/效率低下。
更简单的解释
使用手动操作,这将替换我(用户)复制粘贴我作为示例给出的命令(或我之前描述的伪代码)的输出,并将其用作同一命令的输入,重复相同的操作,直到保留“一个”字节或字符。
如果我理解正确,您正在寻找这样的东西:
$ 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'
Run Code Online (Sandbox Code Playgroud)
这实际上适用于 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
Run Code Online (Sandbox Code Playgroud)
这利用了在 Linux 上所有管道实际上都是命名管道的事实(即它们可以通过路径打开)。使用常规命名管道,它也可以在其他 Unix 系统上运行——请参阅Stackoverflow 上的这个答案。