题目要求
用两种不同的循环语句(for/while/until…)实现以下功能:
(1)输入一个路径,然后使用第一种循环语句,以“文件类型:文件名绝对路径”的格式打印该路径下的所有文件和文件夹,不包含子目录和隐藏文件。如果文件的后缀为.txt,则修改为.abc,对源文件不做修改。要求有路径错误提示。
(2)保存第一种循环语句的输出到当前目录下的临时文件data中。
(3)使用第二种循环语句以同样方式遍历路径下的内容,一边遍历一边检查是否为data中的内容相同,是则返回1,否则返回0。
输出例子:
/usr/local
_:/usr/local/a.abc
d:/usr/local/share
…
1
编程平台
本地
本地操作系统:Windows 10
本地虚拟机运行平台:VMware Workstation Pro 14
本地虚拟机镜像:CentOS-7-x86_64-Minimal-1908.iso
云端
云服务器提供商:阿里云计算有限公司
Linux发行版本及版本号:CentOS 7.6 64位
代码实现
#!/bin/bash
# 第一种循环语句for
echo -n "请输入一个路径(输入default则默认为/usr/share): "
read dir
if [[ ${dir} == "default" ]];then
dir="/usr/share"
fi
if [ -e $dir -a -d $dir ];then
{
if [[ $dir -eq $'\n' ]];then # 判断是否为回车键或空白输入
dir=`pwd`
fi
} >> /dev/null 2>&1
echo $dir
echo $dir > ./data
for file in `ls $dir` # 遍历目录dir下的内容
do
dd="$dir$file" # 拼接目录与其子内容
if [ ! -e $dd ];then # 处理用户输入的目录中末尾无斜杠的情况
dd="$dir/$file" # 为名称之间添加斜杠
fi
type=`ls -ld $dd | cut -c1` # 获得文件类型
echo "${type}:${dd/%.txt/.abc}"
echo "${type}:${dd/%.txt/.abc}" >> ./data
done
else # 路径错误处理
echo $dir
echo "$dir is not a directory!"
echo $dir > ./data
echo "$dir is not a directory!" >> ./data
fi
# 第二种循环语句while
dir=`head -1 ./data` # 获得用户输入的路径
result=1
n=2 # 当前定位到data文件的行数
if [ -e $dir -a -d $dir ];then
files=(${dir%%/}/*) # 顺便删除用户最后可能输入的/
i=0
while [[ $i -lt ${#files[*]} ]]
do
dd="${files[$i]}"
type=`ls -ld $dd | cut -c1` # 获得文件类型
data2="${type}:${dd/%.txt/.abc}"
data1=`head -${n} ./data | tail -n 1`
if [ "$data1" != "$data2" ];then # 逐行检查是否相同
result=0
break
fi
n=`expr ${n} + 1`
let i++
done
else
data2="$dir is not a directory!"
data1=`head -${n} ./data | tail -n 1`
if [ "$data1" != "$data2" ];then
result=0
fi
fi
echo $result
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!