Bash Bug修复:逐行读取文本文件并对其执行操作



以下是我的脚本的样子

#/bin/bash
touch input.txt
touch output.txt
seq -w 0 999 >>input.txt
input=$(cat input.txt)
for i in $input
do
if [ $(($i%2)) -eq 0 ]; then
echo $i "even" >> output.txt
else
echo $i "odd" >> output.txt
fi
done

以下是运行脚本并查看创建的output.txt文件的结果

000 even
001 odd
002 even
003 odd
004 even
005 odd
006 even
007 odd

我希望脚本对脚本的所有1000行都这样做,但我在第9行收到一条错误消息,说

./tester.sh: line 9: 008: value too great for base (error token is "008")

我的最终目标是让脚本在一行中添加每个数字,然后判断这个数字是偶数还是奇数,并将文件的所有1000行输出到output.txt。

最终目标输出文件:

000 even
001 odd
002 even
003 odd
...
505 even
506 odd
507 even
508 odd
...
998 even
999 odd

从000一直到999

使用seq作为seq,并使用printf以您喜欢的格式打印您的数字
Bash算术展开将以零开头的字符串解释为八进制数。您可以像(( 10#$i % 2))一样在数字前面加上10#,以强制数字在第10位。

for i in $input
do
if [ $(( 10#$i % 2)) -eq 0 ]; then
echo $i "even" >> output.txt
else
echo $i "odd" >> output.txt
fi
done
  1. 请记住,算术扩展(( .. ))可以进行比较。if (( 10#$i % 2 == 0 )); then清楚
  2. 我发现printf "%03d" "$i"在这种情况下更清晰
  3. >>之前不需要接触文件,应该以aumatically的方式创建文件(可以通过一些bash set-o选项关闭,但我还没有看到有人使用它(
  4. input=$(cat ...); for i in $input就是不好。不使用的读取行
  5. 我不喜欢临时文件
  6. 如何逐行读取文件

您的脚本只是:

seq 0 999 | xargs -i sh -c 'printf "%03d " "$1"; (( $1 % 2 == 0 )) && echo even || echo odd;'  >>output.txt

如果你喜欢阅读:

seq 0 999 | while IFS= read -r num; do 
printf "%03d " "$num"; 
if (( num % 2 == 0 )); then 
echo even
else
echo odd
fi
done >>output.txt

或者,如果你的input.txt文件必须包含000n001n002n and so on,那么是时候进行tee:了

seq -w 0 999 | tee -a input.txt | while IFS= read -r num; do 
echo -n "$num "
if (( 10#$num % 2 == 0 )); then 
echo even
else
echo odd
fi
done >>output.txt

这是一个用于逐行读取文本文件并对行执行操作的框架代码。。。根据自己的需要填补缺失的部分。

#!/bin/bash
{
while read -r line; do
if (( line % 2 == 0 )); then
# ...
else
# ...
fi
done < input.txt
} > output.txt

您也可以使用<(cmd ...)表示法对输入文件进行预处理:

#!/bin/bash
{
while read -r line; do
...
done < <(arbitrary-cmd input.txt | another-cmd ... )
} > output.txt

这种形式看起来更好,但它产生了一个"子shell",使while块内的代码无法修改在它外部定义的变量(如果有(。

#!/bin/bash
{
arbitrary-cmd input.txt | another-cmd ... | while read -r line; do
...
done
} > output.txt

您的脚本可能类似

#!/bin/ksh
input=$(seq -w 0 999)
for i in $input
do
if [ $(($i%2)) -eq 0 ];then
echo $i "even" >> output.txt
else
echo $i "odd" >> output.txt
fi
done

那么你的输出将类似

000 even
001 odd
002 even
003 odd
004 even
005 odd
006 even
007 odd

然后,您可以grep"even"或"odd"并执行所需内容,也可以直接在if/else语句中执行命令。

这也有效:

#!/bin/bash
for x in `seq -w 0 999`; do
if [ $((10#$x%2)) == 0 ]; then
echo $x even
else
echo $x odd
fi
done > output.txt

最新更新