相关疑难解决方法(0)

如何将输入传递给Bash while循环并在循环结束后保留​​变量

Bash允许使用: cat <(echo "$FILECONTENT")

Bash还允许使用: while read i; do echo $i; done </etc/passwd

结合前两个可以使用: echo $FILECONTENT | while read i; do echo $i; done

最后一个问题是它创建了子shell,而在while循环结束后,变量i不再被访问.

我的问题是:

如何实现这样的目标:while read i; do echo $i; done <(echo "$FILECONTENT")或者换句话说:我怎样才能确定i循环中存活?

请注意我知道封闭while语句{}但这并不能解决问题(想象一下你想在函数中使用while循环并返回i变量)

bash stdin pipe while-loop

80
推荐指数
2
解决办法
8万
查看次数

捕获查找的输出.-print0进入bash数组

使用find . -print0似乎是获取bash中文件列表的唯一安全方法,因为文件名可能包含空格,换行符,引号等.

但是,我很难让find的输出在bash或其他命令行实用程序中有用.我设法使用输出的唯一方法是将它传递给perl,并将perl的IFS更改为null:

find . -print0 | perl -e '$/="\0"; @files=<>; print $#files;'
Run Code Online (Sandbox Code Playgroud)

此示例打印找到的文件数,避免文件名中的换行符损坏计数的危险,如下所示:

find . | wc -l
Run Code Online (Sandbox Code Playgroud)

由于大多数命令行程序不支持空分隔输入,我认为最好的方法是捕获find . -print0bash数组中的输出,就像我在上面的perl片段中所做的那样,然后继续执行任务,无论它是什么是.

我怎样才能做到这一点?

这不起作用:

find . -print0 | ( IFS=$'\0' ; array=( $( cat ) ) ; echo ${#array[@]} )
Run Code Online (Sandbox Code Playgroud)

一个更普遍的问题可能是:如何用bash中的文件列表做有用的事情?

arrays bash null find delimiter

73
推荐指数
4
解决办法
5万
查看次数

(...)和{...}如何在bash中使用管道与子shell创建交互?

我试图理解使用圆括号和大括号的shell子进程调用之间的区别.我认为大括号不会启动子进程,但似乎它们确实启动了一个子进程.

#!/bin/sh

a=1
b=1

( a=2; ) | ( a=3; )
{ b=2; } | { b=3; }

echo "a=$a"
echo "b=$b"
Run Code Online (Sandbox Code Playgroud)

打印此脚本

a=1
b=1
Run Code Online (Sandbox Code Playgroud)

所以似乎所有调用都在子进程内运行.在这种背景下他们之间有什么区别吗?我明白,如果我会用&&||,则{..}不会启动子,但我想了解的管道是如何工作的.

bash

5
推荐指数
1
解决办法
257
查看次数

标签 统计

bash ×3

arrays ×1

delimiter ×1

find ×1

null ×1

pipe ×1

stdin ×1

while-loop ×1