我写了一个基本的shell脚本,它接收log*.zip
(从GitHub actions下载),greps特定文件中所有匹配的行,并以表格形式输出匹配的行。
#!/bin/bash
....
FILENAME=$1
shift
OUT_FN=$1
shift
PATTERN=$@
....
function print_content {
LINE_LENGTH=130
LINE_LENGTH_PRINTF_FORMAT_FILENAME=$(($LINE_LENGTH-3)) # to save calculations in loop
for file in ./*; do
MATCHING_LINES=$(grep -n $PATTERN "$file" | cut -f1 -d:)
[ -z "$MATCHING_LINES" ] && continue
LONGEST_ML=$(wc -L <<< "$MATCHING_LINES")
LINE_LENGTH_PRINTF_FORMAT_LINE=$(($LINE_LENGTH-$LONGEST_ML-7))
PRINTF_FORMAT="| %-"$LONGEST_ML"s | %-"$LINE_LENGTH_PRINTF_FORMAT_LINE"s |\n"
perl -E 'say "-" x '"$LINE_LENGTH"
printf "| %-"$LINE_LENGTH_PRINTF_FORMAT_FILENAME"s|\n" "$file"
perl -E 'say "-" x '"$LINE_LENGTH"
while IFS= read -r line; do
LINE_DATA=$(sed "$line"'q;d' $file | ansifilter | tr -d $'\r')
LINE_DATA=${LINE_DATA#*Z}
LINE_DATA=$(sed 's/^[ \t]*//;s/[ \t]*$//' <<< "$LINE_DATA")
printf "$PRINTF_FORMAT" "$line" "${LINE_DATA:0:$LINE_LENGTH_PRINTF_FORMAT_LINE}"
for (( i=$LINE_LENGTH_PRINTF_FORMAT_LINE; i < ${#LINE_DATA}; i=$(($i+$LINE_LENGTH_PRINTF_FORMAT_LINE)) )); do
printf "$PRINTF_FORMAT" " " "${LINE_DATA:$i:$LINE_LENGTH_PRINTF_FORMAT_LINE}"
done
done <<< "$MATCHING_LINES"
perl -E 'say "-" x '"$LINE_LENGTH"
echo
done
}
LOG_DIR="build build"
unzip $FILENAME "$LOG_DIR"'/*' >/dev/null 2>&1
cd "$LOG_DIR"
....
print_content > "$OUT_FN"
echo "Output saved to file '$OUT_FN'"
cd ..
rm -r "$LOG_DIR"
实际上,脚本不会更改$OUT_FN
的内容。我尝试设置名为test-grepped.log
的文件的内容,然后运行此脚本,输出文件名为test-grepped.log
。我在运行脚本之前和之后检查了测试文件的内容,它们都是相同的。
当我改变
print_content > "$OUT_FN"
到
print_content
并运行脚本,我在终端中得到了以下结果(预期结果)(Unpacking debconf
作为模式传递):
----------------------------------------------------------------------------------------------------------------------------------
| ./3builddistro |
----------------------------------------------------------------------------------------------------------------------------------
| 90197 | I: Unpacking debconf... |
----------------------------------------------------------------------------------------------------------------------------------
Output saved to file 'test-grepped.log'
这证实了函数print_content
工作正常,但是将其输出重定向到文件$OUT_FN
不起作用。重定向整个脚本的输出也如预期的那样工作。但是我希望我的脚本自己将输出重定向到文件,而不是每次都重定向./my-script.sh ... > output.log
。
我的脚本中有什么错误?
请帮帮我。
谢谢
1条答案
按热度按时间ygya80vv1#
正如@user1934428评论的那样,我把
cd
“d”到$LOG_DIR
,然后创建了相对于该目录的$OUT_FN
。由于这个原因,重定向到$OUT_FN
导致在$LOG_DIR
中创建了一个文件,后来我被rm -r $LOG_DIR
删除了。我解决这个问题的方法是,仅在函数
print_content
中将cd
转换为$LOG_DIR
,然后在函数本身中将cd
转换为..
。