Linux 实验一 Linux常用命令和Shell编程

实验一 Linux常用命令和Shell编程

一、实验内容

1. 练习部分
a) 在命令行运行程序时,Linux系统会在$PATH变量中搜索一系列目录来查找对应文件,编写一个脚本将在$PATH变量中路径中的所有可执行文件输出,并统计个数。
脚本

#!/bin/bash
#author: summer
#将PATH变量中的所有可执行文件输出,并计数

#用IFS作分隔符
IFS=:

#用count作计数
count=0

#打印PATH中的变量并计数
for folder in $PATH
	do
		echo "$folder:"
		#读取当前路径下的所有文件
		for file in $folder/*
			do
				#判断文件是否为可执行文件
				if [ -x $file ]
					then
						echo " $file"
						count=$(($count+1))
				fi
			done
	done

#打印可执行文件的数目
echo "count: $count"

运行截图
Linux 实验一 Linux常用命令和Shell编程_第1张图片

b) Linux脚本能极大的提高管理员的工作效率,特别是一些批量完成的任务,编写一个脚本创建多个用户账户。
脚本

#!/bin/bash
#author: summer
#此脚本用于用户账户的创建,用户账户的信息保存在user.csv文本文件中
#user.csv文件中保存的用户信息格式为userid,username, 每个用户一行

#设置读入文件名
input="user.csv"
#以 , 为分隔符读入用户id和name
while IFS=',' read -r userid name
        do
                echo "adding $userid"
                #添加用户,c: 备注信息 u: 用户id m: 用户名
                useradd -c "$name" -u "$userid" -m "$name"
        done < "$input"

运行截图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

c) 归档:Linux系统有良好的文件系统和对应的管理方式,文件适时的归档备份就是其中重要的一项功能,编写脚本完成指定目录的按日归档功能。
脚本

#!/bin/bash
#author: summer
#此脚本完成对指定目录的按日归档并压缩的功能

#获取系统时间并设置格式
DATE=$(date +%y%m%d)

#设置归档压缩文件名
FILE=archive$DATE.tar.gz

#设置配置和目标文件
CONFIG_FILE=/var/sh/Files_To_Backup
DESTINATION=/var/sh/$FILE

#进入到配置文件目录
cd /var/sh

#Main Script
#检查配置文件是否存在
if [ -f $CONFIG_FILE ]
	then    #文件存在,什么也不做
		echo
else  #文件不存在,报告错误并退出脚本
	echo
	echo "$CONFIG_FILE does not exist."
	echo "Backup not completed due to missing Configuration File."
	echo
	exit
fi

#构建要备份的所有文件的名称
FILE_NO=1                 #配置文件第一行
exec < $CONFIG_FILE       #重定向标准输入到配置文件名字

read FILE_NAME            #读取第一条记录
while [ $? -eq 0 ]        #创建备份文件列表
	do
		#确定文件或目录存在
		if [ -f $FILE_NAME -o -d $FILE_NAME ]
			#If file exists, add its name to the list
			then
				FILE_LIST="$FILE_LIST $FILE_NAME"
			#If file doesn't exist, issue warning
			else
				echo
				echo "$FILE_NAME, does not exist."
				echo "Obviously, I will not include it in this archive."
				echo "It is listed on line $FILE_NO of the config file."
				echo "Continuing to build archive list……"
				echo
		fi
	
		#Increase Line/File number by one
		FILE_NO=$[$FILE_NO+1]
		#read next record
		read FILE_NAME
	done

#########################################
#backup the files and compress archive
echo "Starting archive……"
echo
#
tar -czf $DESTINATION $FILE_LIST 2> /dev/null
#
echo "Archive completed"
echo "Resulting archive file is : $DESTINATION"
echo
#
exit

运行截图
Linux 实验一 Linux常用命令和Shell编程_第2张图片
在这里插入图片描述

2. 考查部分
a) 归档:在1-c中的归档脚本的基础上,编写脚本实现按小时归档的功能(可以使用cron计划任务实现)。
脚本

#!/bin/bash
#author: summer
#此脚本用于在1-c中的归档脚本的基础上,实现按小时归档的功能

#在每小时0分时按1-c文本要求进行备份
crontab -l > conf && echo "0 */1 * * * /var/sh/1-c > /dev/null" >> conf && crontab conf && rm -f conf

运行截图
在这里插入图片描述

b) 导入文件数据到MySQL数据库:软件开发的过程常常需要将文本文档或Excel等文件中的纯文本数据导入到数据库表中,编写脚本完成从.csv文件到MySQL数据库的文件导入功能。(附录2提供了一种参考实现)
脚本

#!/bin/bash
#author: summer
#从文件中读取用户id和name,运用脚本插入到数据库中
#文件名:uInfo.csv  数据每行格式 userid,name,

#设置读入文件名
input="uInfo.csv"
while IFS=',' read -r userid name
        do
                #进入数据库,利用不断读取的数据进行插入
                #每插入一个数据,显示一次数据库表中的数据情况
                mysql -u root -p1234 -s -e "
                use userInfo;
                insert into usersaccount (uid, uname) values('$userid', '$name');
                select * from usersaccount;
                exit"
        done < "$input"

运行截图
Linux 实验一 Linux常用命令和Shell编程_第3张图片

二、实验总结
  1. 练习1-a中遇到PATH中环境变量不会切割。
      解决方式:本来是用cut进行切割,但是过于复杂,一直没实现,最后是参考案例代码利用IFS进行分割。
  2. 练习1-c中读取文件时一直显示不存在,不能进行归档。
      解决方式:重复执行,最后发现shell脚本必须与存放归档文件名的文档必须在同一目录或者先进入存档归档文件名的文件所在目录,在1-c脚本中写入语句cd /var/sh 即可,先进入到该文件所在目录。
  3. 考查2-b中,不会再shell脚本中运行mysql语句。
      解决方式:利用谷歌搜索得到多种使用方式,多次尝试即找到可用方式。
  4. 考查2-b中,shell脚本中的mysql语句一直不能运行,
    显示错误:ERROR 1054 (42S22) at line 3: Unknown column ‘afda’ in ‘field list’。
      解决方式:从文档中读取用户id和name到变量后,利用$读取值的问题,不断进行变量读取方式尝试,最后发现用单引号包含变量即可读取。
  5. 小感想:linux下的shell脚本要多多练习,多参考大佬脚本,一方面了解脚本中使用的小技巧,比如IFS分割,另一方面,可以拓展思维。

你可能感兴趣的:(Linux)