我有一个文本文件,其中只有整数值,即不同行中的不同整数(例如从 1 到 47)。我制作了一个脚本,可以读取每一行并获取不同行中存在的值。如果满足条件,那么我想回显一个声明。
的内容a.txt:(一行中只有 1 个,第二行中只有 2 个)1 2 3 4 5 ..如此直到 47。
输出我想要:一旦它显示为 5. 输出 - "Step Completed is 5" (不带双引号)。这应该适用于 5、10、15、20 到 45
这是代码,但它似乎不起作用。
#!/bin/bash
while IFS= read -r line; do
if [[ $line=="5" ]] ; then
echo "Step Completed is:" $var
fi
done < "$1"
另外,我想对每 5 个整数值回显相同的语句,即一旦脚本读取 5,它应该回显 - 步骤已完成是 5。一旦它读取 10,它应该回显 - 步骤已完成是 10。就像这样。
要运行脚本,我使用以下命令:
. ./al.sh a.txt
答案1
我建议不要在 shell 脚本中执行此操作,而是使用awk
:
awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }' <a.txt
这使得代码简短、快速且简单。该awk
代码存储在输入中找到的每个 5 的倍数,并在最后打印找到的最新此类数字。
测试(在具有大括号扩展的 shell 中):
$ printf '%s\n' {1..47} | awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }'
Step 45 completed
等效的 shell 循环看起来像
while read number; do
if [ "$(( number % 5 ))" -eq 0 ]; then
last_step=$number
fi
done <a.txt
printf 'Step %s completed\n' "$last_step"
您可能需要插入一个测试以确保last_step
在执行任何输出之前具有有效值,否则如果您的输入不包含五的倍数,您将得到虚假输出。
答案2
如果您想输出 5 行的“步骤已完成”,则将剩余的步骤号除以 5 并与 0 进行比较:
#!/bin/bash
while IFS= read -r line;
do
if [[ $(( line %5 )) -eq 0 ]] ; then
echo "Step Completed is: $line"
fi
done < "$1"
(也不是在你的脚本中你的变量被调用line
或var
......)
如果您只想要最后一行,那么您必须等到最后才能打印它。如果你有一个完整的数字序列,那么你可以在最后计算它:
#!/bin/bash
while IFS= read -r line;
do
# do whatever for the line
echo $line >/dev/null
done < "$1"
echo "Step completed is: $(( 5 * ( line % 5 ) ))"
否则,请记住您最后看到的内容:
#!/bin/bash
while IFS= read -r line;
do
[[ $(( line %5 )) -eq 0 ]] && line5=$line
# do whatever for the line
done < "$1"
[[ ! -z "$line5" ]] && echo "Step completed is: $line5"