Shell 在bash中使用循环

Shell 在bash中使用循环,shell,for-loop,Shell,For Loop,我有一个“测试”文件,其中有些数据有时放在3个字符串块中。 它看起来像: v1 dad3 v2 100213 v3 <url1> v1 mom5 v2 100255 v3 <url2> ..etc 显然,第二个“for name”循环的工作原理与预期不同:它在所有新目录中创建所有“v1”值的文本文件。我们可以在这里只使用一个循环,还是在第一次处理下一个块时暂停第二个循环(查找下一个v2值并创建新目录)?每次运行grep,它都会从一开始就重新读取文件——因此,如果您在文件

我有一个“测试”文件,其中有些数据有时放在3个字符串块中。 它看起来像:

v1 dad3
v2 100213
v3 <url1>
v1 mom5
v2 100255
v3 <url2>
..etc

显然,第二个“for name”循环的工作原理与预期不同:它在所有新目录中创建所有“v1”值的文本文件。我们可以在这里只使用一个循环,还是在第一次处理下一个块时暂停第二个循环(查找下一个v2值并创建新目录)?

每次运行
grep
,它都会从一开始就重新读取文件——因此,如果您在文件中的位置很重要,则无法使用它执行任何操作

你想要的行为描述不是很清楚。但是,下面的代码应该让您了解如何在一个过程中操作(因此,不需要嵌套循环--“cycles”是您正在使用的词?)

读取时-r var val;做
案例$var in
v1)
v1=“$val”
;;
v2)
v2=“$val”
mkdir-p“$v2”
;;
v3)
v3=“$val”
如果[$v2&&$v1]];然后
curl--“$v3”>“$v2/$v1.txt”
v1=
v2=
其他的
echo“错误:未在前面添加v2和v1的情况下看到v3;忽略”>&2
fi
;;
以撒

为这个问题做一个更好的标题会有帮助。我非常怀疑任何有类似问题的人会通过搜索“使用循环工作”来发现这一点。是的,也许循环是更好的说法。如何读取测试文件?我应该先用“猫”吗?使用awk{print$2}结构也很重要,因为v1、v2、v3只是标记,对于命名,我只需要使用第二个单词,例如“dad3”。看看我的示例是如何工作的——是的,它确实工作,并且它没有或不需要
cat

#!/bin/bash
DIR1=/home/user/aaa
for i in $(grep var2 $DIR1/test|awk '{print $2}');
do mkdir $i;
cd $i;
   for name in $(grep var1 $DIR1/test|awk '{print $2}'); do
   if [ -f "$DIR1/$i/$name" ];
    then echo have;
    else
   touch $name;
   fi
   done;
   cd $DIR1;
done
while read -r var val; do
  case $var in
    v1)
      v1="$val"
      ;;
    v2)
      v2="$val"
      mkdir -p "$v2"
      ;;
    v3)
      v3="$val"
      if [[ $v2 && $v1 ]]; then
        curl -- "$v3" >"$v2/$v1.txt"
        v1=
        v2=
      else
        echo "ERROR: Saw v3 without preceding v2 and v1; ignoring" >&2
      fi
      ;;
  esac
done <test