【发布时间】:2019-02-28 05:21:23
【问题描述】:
你好 Stackoverflow 社区,
请原谅我的天真,但我有一个基本的循环脚本运行一个更复杂的脚本,它正在寻找一个文本文件以获取我作为数组的输入。我猜我已经成功了,但我知道这可以运行得更好、更自动化。
这是我的脚本要查找的文本文件;
2014;14204;
2015;15042;
2015;15062;
...
end;
这是我作为循环运行的 bash 脚本;
{ while IFS=';' read YEAR1 PROJ1 YEAR2 PROJ2 YEAR3 PROJ3 fake
do
{ echo "$YEAR1" | egrep '^#|^ *$' ; } > /dev/null && continue
$local/script.sh \
--forinput1 $YEAR1/$PROJ1 \
--forinput2 $YEAR2/$PROJ2 \
--forinput3 $YEAR3/$PROJ3 \
done
} < textFile.txt
我自己进行了一些研究,发现了一些我认为可行但无法正确实施的方法。如果您能给我一些建议,我将不胜感激。
编辑: 我很抱歉,所以脚本确实可以识别文本文件:
YEAR1;PROJ1;
YEAR2;PROJ2;
YEAR3;PROJ3;
使用“;”作为它的分隔符。它确实在循环中运行,直到它完成的最后一个变量。但是,对于它的功能,我需要在文本文件中添加额外的行
YEAR4;PROJ4;
YEAR5;PROJ5;
end;
然后添加脚本
{ while IFS=';' read YEAR1 PROJ1 YEAR2 PROJ2 YEAR3 PROJ3 YEAR4 PROJ4 YEAR5 PROJ5 fake
do
{ echo "$YEAR1" | egrep '^#|^ *$' ; } > /dev/null && continue
$local/script.sh \
--forinput1 $YEAR1/$PROJ1 \
--forinput2 $YEAR2/$PROJ2 \
--forinput3 $YEAR3/$PROJ3 \
--forinput4 $YEAR4/$PROJ4 \
--forinput5 $YEAR5/$PROJ5 \
done
} < textFile.txt
我希望完成的是在数组中添加变量,但不必在脚本中添加额外的语法
这已经坏了,但我猜我在看什么
{ while IFS=';' read -a YEAR PROJ < textFile.txt
for ((i = 0; i < "${#YEAR[@]};${#PROJ[@]}"; i++)); do
{ echo "$YEAR[$i]" | egrep '^#|^ *$' ; } > /dev/null && continue
$local/script.sh \
--forinput[$i] ${YEAR[$i]}/${PROJ[$i]} \
done
}
【问题讨论】:
-
您包含的
read命令似乎期望每行至少包含六个字段而不是两个字段。如果这确实是您的输入,并且您有多行记录,那么您可能应该包含更多记录并描述如何区分它们。另外,请包括您的预期输出。我们可以改进脚本的风格,但最好知道你想从中得到什么。 -
您的循环将只运行一次,因为
egrep将在read再次运行之前消耗textFile.txt的其余部分。 -
你真的想用文件中的所有参数调用一次 script.sh 吗?还是你有其他意图?
-
@chapner,真的吗? egrep 从 echo 语句中获取输入,然后退出。
-
您可以将
egrep '^#|^ *$'测试移出循环:while ..;do..done < <(egrep -v '^#|^ *(;|$)' texttFile.txt)。