如何解决我可以做一个循环而不是两个吗?
我在$ {MY_DIR}有文件列表。
ABC_foo123.txt
ABC_foo456.txt
ABC_bar100.txt
需要对这些文件进行一些操作。
我的代码:
#!/usr/bin/ksh
ls -l ${MY_DIR}/ABC_foo*.txt
RV=$?
if [[ $RV -eq 0 ]];then
echo "files found for processing"
for sFile in `ls -1 ${MY_DIR}/ABC_foo*.txt`
do
fileNameOnly=$(basename ${sFile})
echo processing $sFile
#Doing some operations here
done
else
echo "No foo files found to process"
fi
ls -l ${MY_DIR}/ABC_bar*.txt
RV=$?
if [[ $RV -eq 0 ]];then
echo "files found for processing"
for sFile in `ls -1 ${MY_DIR}/ABC_bar*.txt`
do
fileNameOnly=$(basename ${sFile})
echo processing $sFile
#Doing some operations here
done
else
echo "No bar files found to process"
fi
这正在按预期进行。但是,有没有一种方法可以使用一个循环而不是两个循环。我感觉自己在做两次相同的事情。 欢迎任何建议
解决方法
不确定ksh
,但是您可以在bash
中进行
for sFile in ABC_{foo,bar}*.txt; do
在通用shell中,您可以简单地执行以下操作:
for sFile in ABC_foo*.txt ABC_bar*.txt; do
要检查是否已处理任何文件,执行以下操作可能更干净:
flag=0
for sFile in "${MY_DIR}"/ABC_foo*.txt "${MY_DIR}"/ABC_bar*.txt; do
flag=1
# process sFile
done
if test "$flag" = 0; then echo "error" >&2; done
使用glob可以防止由于过滤ls
的输出而引起的许多错误,但是在非常大的目录(例如,具有数十万个条目的目录)中可能会遇到问题。如果这是一个问题,您可能想看看find
的变体。
如果每种类型的处理方式不同:
#!/bin/ksh
MY_DIR=$1
nbr_txt=0
nbr_sql=0
for file in $MY_DIR/*.txt $MY_DIR/*.sql; do
case ${file##*/} in
*.txt) ((nbr_txt++))
# Processing txt type files
;;
*.sql) ((nbr_sql++))
# Processing sql type files
;;
esac
done
print "$nbr_txt txt files processed"
print "$nbr_sql sql files processed"
根据评论编辑
,当您在不同的地方使用相似的代码时,请考虑一个函数。
像
#!/usr/bin/ksh
operate_file() {
filebase="$1"
extenstion="$2"
ls -l ${MY_DIR}/${filebase}*.${extension}
RV=$?
if [[ $RV -eq 0 ]]; then
echo "files found for processing"
for sFile in ${MY_DIR}/${filebase}*.${extension}; do
fileNameOnly=$(basename ${sFile})
echo "processing $sFile"
#Doing some operations here
done
else
echo "No foo files found to process"
fi
}
operate_file ABC_foo txt
operate_file ABC_bar sql
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。