当前位置: 首页 > 知识库问答 >
问题:

如何将输入管道传输到Bash time循环并在循环结束后保留变量

赵涵亮
2023-03-14

Bash允许使用:cat

Bash还允许在读取i时使用:; do echi$i;完成

要将前两者结合使用,可以使用以下选项:echo$FILECONTENT | while read i;do echo$i;完成

最后一个的问题是,它会创建子shell,并且在while循环结束后,无法再访问变量i。

我的问题是:

如何实现这样的东西:而读i;做回显$i;完成

请注意,我知道将while语句包含在{}中,但这并不能解决问题(假设您希望在函数中使用time循环并返回i变量)


共有3个答案

陶福
2023-03-14

此函数用于复制jpg文件的$NUM次(bash)

function makeDups() {
NUM=$1
echo "Making $1 duplicates for $(ls -1 *.jpg|wc -l) files"
ls -1 *.jpg|sort|while read f
do
  COUNT=0
  while [ "$COUNT" -le "$NUM" ]
  do
    cp $f ${f//sm/${COUNT}sm}
    ((COUNT++))
  done
done
}
邹俊拔
2023-03-14

Jonathan Leffler解释了如何使用进程替换来执行您想要的操作,但另一种可能性是使用这里的字符串:

while read i; do echo "$i"; done <<<"$FILECONTENT"

这节省了一个过程。

斜俊
2023-03-14

进程替换的正确表示法是:

while read i; do echo $i; done < <(echo "$FILECONTENT")

循环终止时,循环中分配的最后一个值i可用。另一种选择是:

echo $FILECONTENT | 
{
while read i; do echo $i; done
...do other things using $i here...
}

大括号是一个I/O分组操作,本身并不创建子shell。在这种情况下,它们是管道的一部分,因此作为子shell运行,但这是因为 。你在问题中提到了这一点。好了,您可以在函数中从这些函数中进行返回。

Bash还提供了shop内置,它的许多选项之一是:

最后一根管道

如果设置,并且作业控制未激活,则shell运行当前shell环境中未在后台执行的管道的最后一条命令。

因此,在脚本中使用这样的东西会使修改后的sum在循环之后可用:

FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe   # Comment this out to see the alternative behaviour
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum

在命令行中执行此操作通常会违反“作业控制未激活”(即在命令行中,作业控制处于激活状态)。在不使用脚本的情况下对此进行测试失败。

此外,正如Gareth Rees在他的回答中指出的,您有时可以使用这里的字符串

while read i; do echo $i; done <<< "$FILECONTENT"

这不需要shop;您可以使用它保存一个进程。

 类似资料:
  • 我一直在寻找如何弄清楚如何让一个输入或某些东西进入一个time循环。就像在,输入()命令不会停止我的秒表。我尝试过tkinter、pygame和其他几种方法,但它们都不起作用。如果有人能帮我,我更喜欢小而简单的东西,如果这是可能的话。具体来说,我想学习做什么,基本上是允许在按下任何键时立即停止(最好不按回车键)。谢谢,马鞍猪! 以下是我到目前为止的情况,没有任何东西可以激活停止:

  • 我正在进行模拟测试,我正在努力创建一个循环,将循环输入12次,同时将每个输入添加到总和。 确定一个人在特定年份的平均体重。 对于每个月,您的算法应该输入该人当月的体重(正实数)。您的算法应该循环,重复输入,直到输入为正。 最后,您的算法输出平均权重。 在浏览了关于迭代控制结构的课堂笔记后,我想到了这个: 不幸的是,所有这些对我来说都是重复输入无限次,直到我输入一个大于12的数字。 我只想让控制台输

  • 我正在制作一个程序,它从用户那里获取一个字符串并用分隔符逐字分隔它,它几乎完成了。但是,在第一个完整循环之后,来自用户的下一个输入不会通过最后一个while循环。 下面是我要说的代码片段: 我想我需要在单词increment和print行周围再循环一次,并在输入中使用continue序列。hasNext()循环,因为这就是我使用int来运行类似程序的方式,但我不确定这将如何处理字符串。 有什么建议

  • 对于我的程序,我要编写一个程序,它接受2到10之间的行数。生成n行的乘法三角形。每行包含的条目不超过其行大小。这一点我没有问题。但是,在用户将数字0输入到我的问题“请输入要打印的行数:”之后,应该终止循环并打印“感谢您使用此程序!”我用了一个DO。。。WHILE循环以确定用户是否希望继续。在我的循环中,我将用户想要打印的数字声明为int num。我的循环应该持续到num

  • 我试图将扫描仪输入添加到< code>ArrayList中,但是在输入完输入后,我无法退出循环。完成输入后,如何退出这个循环? ;

  • 你好,这是我的程序的目的: 编写一个程序,计算三个月期结束时储蓄账户的余额。它应该向用户询问起始余额和年利率。然后,循环应在此期间每月迭代一次,执行以下步骤: a)向用户索要当月存入账户的总金额,并将其添加到余额中。不接受负数。 B) 询问用户当月从账户中提取的总金额,并从余额中减去。不接受负数或当月存款加进去后大于余额的数字。 C) 计算当月的利息。月利率是年利率除以12。将月利率乘以该月起止余