当我尝试在for循环中运行for循环时,我遇到了问题。
我尝试用步骤10的ips制作24个文件。
要在第一个文件中解释更多,我需要让所有的ips在1-10和第二个11到20之间结束,依此类推。
我尝试使用:
for i in {1..240}
do
for r in {1..24}
do
if [ "$i" -le "$r0" ]
then
echo "4.2.2.$i" >> "server-$r"
fi
done
done
我收到的错误是当我运行bash -xv script_name:
时script_name: line 5: [: : integer expression expected
+ for r in '{1..24}'
+ '[' 240 -le '' ']'
script_name: line 5: [: : integer expression expected
+ for r in '{1..24}'
+ '[' 240 -le '' ']'
script_name: line 5: [: : integer expression expected
文件名是server- $ r,即server-1,server-2,依此类推,直到server-24
有什么建议吗?
谢谢。
答案 0 :(得分:3)
错误如下:
if [ "$i" -le "$r0" ]
您没有变量r0
,这会导致错误。说:
if [ "$i" -le "${r}0" ]
反而是为了避免含糊不清。
由于你希望乘以数字10,你可以用数学方式把它写成:
if [ "$i" -le $((r*10)) ]
甚至
(( i <= r*10 ))
答案 1 :(得分:1)
这不是以任何方式做事的bash-native / idiomatic方式。
for ((i=1; i<=240; i++)); do
for ((r=1; r<=24; r++)); do
if (( i <= (r * 10) )); then
echo "4.2.2.$i"
fi
done >"server-$r"
done
每个server-$r
值只打开一次$r
文件比为每个echo
打开它更有效(否则每次需要时都打开和关闭文件)要被访问),并且使用诸如{1..3}
之类的扩展是不灵活的(仅支持文字数字,而不是变量)并扩展到迭代的词表,因此使用比使用C风格的循环更多的内存。