练习1:
- 在自己的用户主目录下新建两个子目录subdir1 subdir2
- 将/home/wmn/passwd文件拷贝到subdir1, 拷贝/home/wmn/group到subdir2
- 将subdir2重命名为subdir
- 对subdir1进行打包并且压缩成xz格式
- 将打包后的xz格式文件拷贝到subdir目录下
- 解压subdir目录下的压缩格式文件
- 查看subdir目录下所有的文件
#在自己的用户主目录下新建两个子目录subdir1 subdir2
mkdir subdir1 subdir2
#将/home/wmn/passwd文件拷贝到subdir1, 拷贝/home/wmn/group到subdir2
cp subdir1 /home/wmn/passwd
cp subdir2 /home/wmn/group
#将subdir2重命名为subdir
mv subdir2 subdir
#对subdir1进行打包并且压缩成xz格式
tar -cf subdir1.tar subdir1
xz -z subdir1.tar
#将打包后的xz格式文件拷贝到subdir目录下
cp subdir1.tar.xz l /home/wmn/subdir
#解压subdir目录下的压缩格式文件
xz -d subdir1.tar.xz
#查看subdir目录下所有的文件
cd subdir
ls
练习2
- 定义一个变量VAR1,用来保存PATH环境变量内容
- 定义一个变量VAR2,用来保存HOME环境变量内容
- 完成VAR1和VAR2这两个变量交换,然后输出这个变量的值
VAR1=$PATH
VAR2=$HOME
T=$VAR1
VAR=$VAR2
VAR1=$T
echo $VAR1 $VAR2
练习3
- 将用户输入的第一个单词赋值给var1,第二个单词赋值给var2,剩下的单词赋值给var3
- 完成var1和var2这两个变量交换,然后输出这三个变量的值
read var1 var2 var3
t=$var1
var1=$var2
var2=$t
echo $var1 $var2 $var3
练习4
- 通过输入一个(已经存在的)用户名来寻找用户在/etc/passwd中的行号,并输出这一行对应/etc/passwd文件中用户信息并按照以下格式输出打印
- Line number is: 26
- Userinfo is as follows: NAME: UID: GID
echo -n "input username:"
read username #获取用户输入的用户名
#获取行号
line=`cat /etc/passwd | cut -d ":" -f 1 | grep -n "^$username$" | cut -d ":" -f 1`
echo "The line number is:$line"
#获取用户名+gid+uid
user_info=`head -$line /etc/passwd | tail -1 | cut -d ":" -f 1,3,4`
echo "Userinfo is as follows: $user_info"
技术总结:
- Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入(内心os:学了两个月linux我居然现在才知道嘤嘤嘤)
- cat /etc/passwd 获取到/etc/passwd里面全部的内容
- cut是一个选取命令,就是将一段数据经过分析,取出我们想要的东东
- cut 的参数 -d :自定义分隔符; -f :与-d一起使用,指定显示哪个区域。
- cut -d ":" -f 1 意思就是以自定义分隔符:分割,分割后的第一个列的内容
- grep -n "^$username$" 就是为了找到满足条件的行,-n会显示其行数,这一行的内容要包含username
- "^$username$" 是一个正则表达式,^表示匹配首字符,所以满足要求就需要以username变量值开头
- cut -d ":" -f 1` 再次出现,不赘述啦,就是为了获得行号~
- head -$line /etc/passwd 在指定文件下,获得前某行的内容
- tail -1 获取最后一行的内容
- cut -d ":" -f 1,3,4` 以:为分隔符切切切,获取第一1,3,4列的内容
练习5
- 输入一个成绩,用if-else语句判断成绩的等级
- [80-100] A
- [60-80) B
- [0-60) C
- 如果成绩非法不是[0-100],则提示用户输入的成绩是非法的成绩
echo -n "Input a score : "
read score
if [ $score -lt 0 -o $score -gt 100 ]
then
echo "Invalid score:$score"
else
if [ $score -ge 80 -a $score -le 100 ]
then
echo "A"
elif [ $score -ge 60 -a $score -lt 80 ]
then
echo "B"
else
echo "C"
fi
fi
练习6
- 输入一个成绩,用case语句判断成绩的等级 (思想:将成绩/10)
- [80-100] A 8,9,10
- [60-80 ) B 6,7
- [0-60 ) C 0,1,2,3,4,5
- 如果成绩非法不是[0-100],则提示用户输入的成绩是非法的成绩
echo -n "input a score: "
read score
if [ $score -lt 0 -o $score -gt 100 ]
then
echo "invalid score:$score!"
else
score=$((score/10))
fi
case $score in
8|9|10)
echo "A"
;;
6|7)
echo "B"
;;
0|1|2|3|4|5)
echo "C"
;;
esac
练习6
- 输入一个路径,并判断该路径是否合法(是否存在该路径)
- 如果合法,则输出该路径下的普通文件以及其它文件的个数。
echo -n "input a pathname:"
read pathname
if [ ! -d $pathname ]
then
echo "Invalid path!"
exit
fi
flist=`ls $pathname`
echo "flistlist: $flist"
var1=0 #记录普通文件个数
var2=0 #记录其他文件个数
cd $pathnameecho -n "input a pathname:"
read pathname
if [ ! -d $pathname ]
then
echo "Invalid path!"
exit
fi
flist=`ls $pathname`
echo "flistlist: $flist"
var1=0 #记录普通文件个数
var2=0 #记录其他文件个数
cd $pathname
for file in $flist
do
if [ -f $file ]
then
echo "i'm in"
((var1++))
else
((var2++))
fi
done
echo "filenum:$var1 otherfilenum:$var2"
for file in $flist
do
if [ -f $file ]
then
echo "i'm in"
((var1++))
else
((var2++))
fi
done
echo "filenum:$var1 otherfilenum:$var2"
练习7
- 设计一个函数,通过传递的用户名来寻找用户在/etc/passwd中的行号(存在:返回行号,不存在:返回0) (提示:如果行号为空字符串,则表明未找到该用户)
- 设计一个函数,通过传递的行号,输出这一行对应/etc/passwd文件中用户信息如下 The user: NAME:UID:GID
- 循环读取用户输入的用户名,然后分别调用设计的函数,输出用户的信息,如果用户不存在,则告诉输入者这个用户在系统中不存在,如果输入的是"quit",则结束。
function check_username(){ #输入用户名,如果用户存在,返回其行号,否则返回0
username=$1 #获取用户名
line=`grep -n ^$username /etc/passwd | cut -d : -f 1` #获取行号
if [ -z $line ]
then
return 0
else
return $line
fi
}
function get_userinfo(){ #根据行号获得用户信息
line=$1
info=`head -$line /etc/passwd | tail -1 | cut -d : -f 1,3,4` #方法1
#info=`sed -n ${line}"p" /etc/passwd | cut -d : -f 1,3,4` #方法2
echo $info
}
while true #不quit就一直循环
do
echo -n "Input a username:"
read username #获取用户的输入
if [ "$username" = "quit" ] #quit了就退出
then
break
fi
check_username "$username"
line=$? #获取返回的行号
if [ $line -eq 0 ]
then
echo "$username is not existed!!"
continue
fi
info=`get_userinfo $line`
echo "the user is in line: $line"
echo "the userinfo is $info"
done
技术总结:
- if - then - fi 要配套使用!!经常忘了then,这样要不得啊!!
- while - do - done 也要配套使用!!经常忘了do - done,不可以!!
- if 的条件是放在[ ]里面,且中括号左右留一个空格,细心细心!!
- 判断一个变量是不是为空可以用: if [ -z $var ]
- 还要再熟悉一下两种调用函数的方法哦!!
- break和continue的用法和其他编程语言一样,灵活运用
- get了一种字符串拼接的方法,例如:${value1}"=",就实现了变量value1和=的拼接~