Bash:关于循环,数组和变量

时间:2014-06-11 18:07:16

标签: bash

我希望我能在正确的地方提出这个问题。

我正在使用一个相当简单的bash脚本,但是我几天前刚刚开始编写bash脚本,而且我已经遇到了一些问题。

我见过熟悉的问题,但在说读这篇文章或复制或谷歌之前,明白我尝试了很多方法,而我只是坚持这个障碍。

我有以下代码:

find ~/bin/ -type f ! \( -iname '*~' -o -iname '.*' \) -exec basename {} \; | sort | while read line; do
let i=i+1
command_array[$i]="$line"
echo "$i : ${command_array[$i]}"
done

echo $i
echo "array check : ${command_array[*]}"

我想从循环中获取这些变量。正如我所读到的,似乎我需要在管道之前制作这些变量?我不知道如何使用我当前的代码完成此操作。它是以下组合:我不确定如何重新构建代码以查找文件以适应这种情况。看起来愚蠢是我应该努力实现的目标:

n=0
printf %s "$foo" |
while IFS= read -r line; do
n=$(($n + 1))
done
echo $n

虽然我部分理解这里发生了什么,但我仍然迷失了如何开始将我所拥有的东西切换到这样的东西来获取变量。

我不是在寻找有人为我重新编码,但是一些提示或提示让这个方向朝着正确的方向发展会很棒。

1 个答案:

答案 0 :(得分:1)

使用while read循环消耗命令输出时避免子shell的典型方法是重写它以从进程替换重定向。

而不是:

foo | bar | while read baz; do (( i++ )); done
echo "$i"  # Unset

使用

while read baz; do (( i++ )); done <   <(foo | bar)
echo "$i"  # Works

PS:ShellCheck会自动发出警告,并链接到一个页面,其中包含有关如何重新构建像这样的while循环的文档。