附录 Shell实例整理
一、批量创建用户
批量创建1000个用户
用户名为:班级+学号+昵称;每个班为一个组群
能够自动删除所创建的用户
每成功创建或删除一个用户,在屏幕上显示用户名
#!/bin/bash
echo "==========create the group=========="
read -p "input the groupname what you want to create:" a
A=`cut -d: -f1 /etc/group|grep $a|wc -w`
if [ $A -eq 1 ]
then
echo "groupname already exist,please go ahead"
else
groupadd $a
fi
echo "==========how many users you want to add=========="
read -p "input the numbers of users: " num
count=1
while [ $count -le $num ]
do
B=`cut -d: -f1 /etc/passwd|grep ${a}Student$count|wc -w`
if [ $B -eq 1 ]
then
echo "The user ${a}Student$count is already exist!"
else
useradd -G $a ${a}Student$count
echo "user ${a}Student$count add successfully"
fi
count=$(($count + 1))
done
read -p "do you want remove the new users? y or n: " do
let count=count-1
if [ "$do" = y ]
then
for(( count; count >= 1;count-- ))
do
userdel -r ${a}Student$count
echo "user ${a}Student$count del successfully"
done
else exit
fi
二、批量创建目录和文件
目录名为:dir1, dir2, …, dir10
每个目录下分别新建10个文本文件,文件名为:目录名+file1~10
并设置每个文件的权限:
文件所有者:读+写+执行
同组用户:读+执行
其他用户:读+执行
等待键盘输入一个数字,范围为1~10
重命名该级目录(假设输入数字为“5”,则为“dir5”目录)下所有文件的扩展名为bak,并将该目录下所有文件名保存到一个文本文件
删除包含该数字的所有目录和文件
#!/bin/bash
#
# 目录名为:dir1, dir2, …, dir10
# 每个目录下分别新建10个文本文件,文件名为:目录名+file1~10
# 并设置每个文件的权限:
# 文件所有者:读+写+执行
# 同组用户:读+执行
# 其他用户:读+执行
# 等待键盘输入一个数字,范围为1~10
# 重命名该级目录(假设输入数字为“5”,则为“dir5”目录)下所有文件的扩展名为bak,
# 并将该目录下所有文件名保存到一个文本文件
# 删除包含该数字的所有目录和文件
function addFile(){
for((i=1;i<=10;i++))
do
mkdir /usr/src/dir$i
chmod 755 -R /usr/src/dir$i
for((j=1;j<=10;j++))
do
touch /usr/src/dir$i/dir${i}file$j
done
done
}
read -p "which files(1~10) do you want to option:" num
addFile
ls /usr/src/dir$num >> /usr/src/fileOut.txt
#mv /usr/src/dir$num/dir${num}file* /usr/src/dir$num/dir${num}file*.bak
cd /usr/src/dir$num
for f in `ls /usr/src/dir$num`
do
mv $f $f.bak
done
echo "option successfully"
read -p "are you sure to remove this directory which with this number:" op
case $op in
y)
rm -rf /usr/src/dir$num ;;
*)
exit;;
esac
三、定时备份文件
每天18:00归档/etc目录下的所有文件,归档文件名为如下形式:etc-YYYY-MM-DD;保存在/home/user/backup目录下,其中user为当前登录用户名
需要编写一个脚本,放到/etc/cron.d/script :
#!/bin/bash
DATE=`date +%F`
tar -cvf /etc-$DATE /etc
mkdir /home/$USER/backup
mv /etc-$DATE /home/$USER/backup
四、查找统计
查看/etc/passwd中所有包含字符串“aa”的用户,并将结果保存在文本文件中
grep "aa.*" /etc/passwd|cut -d: -f1 >file
查看/bin中包含字符串“ls”的文件名,并将结果保存在文本文件中
ls /bin|grep "ls.*" >file
把/bin和/sbin下的文件名保存到文件commandview中
ls /bin /sbin >commandview
统计/bin和/sbin下的文件数量
ls /bin |wc -l
ls /sbin|wc -l
脚本代码:
#!/bin/bash
#查看/etc/passwd中所有包含字符串“aa”的用户,并将结果保存在文本文件中
grep "aa.*" /etc/passwd|cut -d : -f1 >> /home/luzy/practice1/text/file1
echo ‘******************’ >> /home/luzy/practice1/text/file1
#查看/bin中包含字符串“ls”的文件名,并将结果保存在文本文件
ls /bin |grep "ls.*" >> /home/luzy/practice1/text/file1
echo ‘******************’ >> /home/luzy/practice1/text/file1
#把/bin和/sbin下的文件名保存到文件command中
ls /bin /sbin >> /home/luzy/practice1/text/command
#echo ‘******************’ >> /home/luzy/practice1/text/file1
#统计/bin和/sbin下的文件数量
ls /bin | wc -l >> /home/luzy/practice1/text/file1
ls /sbin | wc -l >> /home/luzy/practice1/text/file1
五、加减乘除运算
两个操作数和一个运算符由位置参数给出 在屏幕上分别显示操作数、运算符和运算结果
#!/bin/bash
read -p "input first num: " a
read -p "input +-*/ : " b
read -p "input second num: " c
jg=`echo "scale=2; $a $b $c"|bc`
echo " $a $b $c = $jg "
echo "========================================================================="
read -p "Do you want to continue? y/n:" C
case $C in
y) sh ys.sh;;
n) exit;;
esac
六、按照运行结果编写Shell程序:
0
101
21012
3210123
432101234
54321012345
6543210123456
765432101234567
87654321012345678
9876543210123456789
#!/bin/bash
for ((i=0;i<=9;i++))
do
j=$i
for ((j;j>=0;j--))
do
echo -n "$j"
done
k=1
for ((k;k<=i;k++))
do
echo -n "$k"
done
echo
done
七、逆序输出一个字符串
#!/bin/bash
#逆序输出一个字符串
read -p "please input string:" str
echo "$str" | rev
八、冒泡法对10个数按升序排序
#!/bin/bash
#冒泡排序十个数
for((i=0;i<=9;i++))
do
#使用内置随机变量产生十个1000以内的数
arr[i]=$(($RANDOM%1000))
done
echo "${arr[@]}"
function fm(){
for((a=0;a<=9;a++))
do
for((b=a+1;b<=9;b++))
do
if [[ ${arr[a]} -gt ${arr[b]} ]]
then
x=${arr[a]}
arr[$a]=${arr[b]}
arr[$b]=$x
fi
done
echo "${arr[a]}"
done
echo "${arr[@]}"
}
fm
九、编写一个menu的Shell程序,执行后的界面为:
NumberNameFor Linux Menu
1exitleave
2viedit a file
3datedate
4calcalendar
5wholist the users
6lslist the files in this directory
7catdisplay a file on the screen
Please input a number or a name for the action you wish:
#!/bin/bash
echo "NumberNameFor Linux Menu"
cat << EOF
1 exitleava
2 viedit a file
3 datedate
4 calcalendar
5 wholist the users
6 lslist the files in this directory
7 catdisplay a file on the screen
EOF
read -p "Please input a number or a name for the action you wish:" num
case $num in
1) exit;;
2) read -p "Input a filename:" A
vi $A;;
3) date;;
4) cal;;
5) cut -d: -f1 /etc/passwd;;
6) ls -la .;;
7) read -p "Input a filename:" B
cat $B;;
esac
echo "========================================================================="
read -p "Do you want to continue? y/n:" C
case $C in
y) sh menu.sh;;
n) exit;;
esac
十、求n的阶乘
#!/bin/bash
#求n的阶乘
#方法一
function mathod1(){
a=1
for((i=1;i<=num;i++))
do
a=` expr $i \* $a `
done
echo "${num}! = $a"
}
#方法二
function m2(){
if [ $1 -eq 1 ]
then
echo "1"
else
local x=$[ $1 -1 ]
local y=`m2 $x`
a=`expr ${x} \* ${y}`
# echo " $[ $1 - 1 ]! = ${a}"
echo "$a"
fi
}
read -p " please input a number(>0):" num
read -p " which mathod you chose(1 or 2) :" m
case $m in
1)
mathod1 ;;
2)
re=`m2 $[ $num + 1 ]`
echo "${num}!= $re";;
*)
echo "no such mathod!"
;;
esac
Shell实例二
一、需求分析
1.任务目标
Linux作为多用户、多任务的操作系统,其系统资源是所有用户共享的。对用户的管理是操作系统的重点。LINUX课程设计要用shell编程实现,将理论学习付诸实践。设计一个脚本(shell)程序能实现增加、删除、查找和显示特定用户信息的功能。
2.系统要求
程序要包括四个文件,即menu,add,delete,passwd四个文件。passwd文件是用来保存用户信息;menu文件是主菜单,要求运行的时候能显示一个菜单供用户选择;add文件是用来增加信息;delete文件是用来删除信息。在主Shell脚本文件里(必须以 menu 命名)要有一个多操作选项的菜单以便用户从中选择。对于任务6和7,需要编写单独的Shell脚本文件(必须分别命名为add和delete)并且在主脚本menu文件中调用这些脚本文件。在主目录下建立一个以 07wl-0x-xx(x为班、座号)命名的目录,并且在作业中使用它作为工作目录。
3.系统功能
在主Shell脚本文件里(即menu 文件)要有一个多操作选项的菜单以便用户从中选择。在不同任务的中,这些操作能自动实现以下功能:
1、在屏幕上显示当前所有用户的记录
2、在屏幕上显示当前所有用户(经过格式化和排序的)的记录
3、只在屏幕上显示用户名和用户ID
4、只在屏幕上显示(经过格式化和排序的)用户名和用户ID
5、查询并显示特定用户的记录
6、往passwd文件里增加新的用户记录
7、从passwd文件里删除某个用户记录
其中: menu文件中的程序完成1,2,3,4,5功能;另外写一个add脚本文件和delete脚本文件分别实现选项6和7.当用户做了选择且所选的操作完成之后,可以再次显示主菜单以供用户做下一步选择。用while循环和case条件语句配合来完成此操作。
二、总体设计
功能图
流程图
2.1 主菜单
2.2 add模块
![](http://i.imgur.com/pXkCndp.png)
2.3 delete模块
![](http://i.imgur.com/0GSv58g.png)
三、详细设计
一、 Menu主菜单
(1)主菜单
(2)创建如下菜单
(3)无效输入
当用户做了选择且所选的操作完成之后,应再次显示主菜单以供用户做下一步选择。在以上等待用户做出选择的菜单中,如果用户偶尔输入了一个代码而不是1、2、3、4、5、6、7或Q,就有信息提示“无效的代码,请按回车键继续”。等用户按了回车键之后,再次显示主菜单供用户做其他选择。如图:
(4)无输入
在以上等待用户做出选择的菜单中,如果用户简单地按了回车键,就会出现信息“无效的代码"。等用户按了回车键之后,再次显示主菜单供用户做其他选择。
(5)选择1时——打印当前所有用户记录
(6)选择2时——打印当前经格式化的用户记录
(7)选择3时——打印用户名和用户ID
(8)选择4时——打印(格式化)用户名和用户ID
(9)选择5时——查找特定的记录
如果输入的关键字不在记录里
如果用户简单地按回车键而不是输入关键字
二、ADD文件
(1)当用户在主菜单里选择6时你的add脚本文件就要被调用
(2)输入用户名
用户输入一个无效的用户名
用户只按回车没有输入
(3)输入密码
输入密码时不显示
要求密码长度至少达到6位以上
确认密码如果与密码不符合应该让用户重新输入
(4)用户ID
若用户只是简单的按回车键
若用户输入的是一个无效的ID或者是不符合格式的ID
(5)组ID
对组ID的要求类似与用户ID,一个有效的组ID(数字、一般非超级用户的ID大等于500)
(6)登录shell
一个有效的shell必须只能是bash、sh、kash、csh中的一种
如果用户只按回车没有输入的话则显示信息:“没有输入!”,并提示用户再次输入shell名
(7)保存记录
三、DELETE文件
(1)当用户在主菜单中选择7时,delete脚本文件必须被调用
(2)用户输入一个无效的用户ID
(3)用户简单的按回车键而没有任何输入
(4)继续删除
四、附录(程序代码)
1、Menu主脚本文件代码
#!/bin/bash
#在屏幕上操作选项菜单
#声明全局变量
dataSource=/home/luzy/practice2/passwd
homePath=/home/luzy/practice2
AddUser=/home/luzy/practice2/Add.sh
DeleteUsers=/home/luzy/practice2/Delete.sh
CheckDataSourceFileExist(){
if [ -f $dataSource ]
then
#文件存在
return 0;
else
#文件不存在
clear;
echo -n "警告【$dataSource】不存在!请确认!";
read;
return 1;
fi
}
choice="F";
while [ $choice != "Q" -a $choice != "q" ]
do
CheckDataSourceFileExist;
if [ $? -ne 1 ]
then
clear;
echo " 用户信息管理主菜单";
echo "===================================================";
echo " 1.显示当前所有记录"
echo " 2.格式化显示当前所有记录"
echo " 3.显示用户名和用户ID"
echo " 4.格式化显示用户名和ID"
echo " 5.查询特定用户信息"
echo " 6.添加新用户"
echo " 7.删除用户"
echo " Q.退出"
echo -n "你的选择:"
read choice
#作用是清除由于read到string.Empty的时候引发的bash参数过多的错误。
if [ -z $choice ]
then
choice="empty";
fi
clear;
if [ $choice = "empty" ];
then
echo "选项尚未选择!";
else
case $choice in
1) CheckDataSourceFileExist;
if [ $? -ne 1 ]
then
echo "当前的所有的用户信息如下所示:";
echo "用户名 密码 ID GID 说明 工作目录 登录Shell"
cat $dataSource | tr ":" " " | more;
fi;;
2) CheckDataSourceFileExist;
if [ $? -ne 1 ]
then
echo "当前的所有的用户信息如下所示:";
echo -e "用户名\t密码\tID\tGID\t说明\t工作目录\t登录Shell"
sort -k 1 $dataSource | awk -F ":" '{print $1 "\t" $2 "\t" $3
"\t" $4 "\t" $5 "\t" $6 "\t" $7 "\t"}' | more;
fi;;
3) CheckDataSourceFileExist;
if [ $? -ne 1 ]
then
echo "当前的所有的用户的用户名和用户ID如下所示:";
echo -e "用户名,ID";
awk -F ":" '{print $1 "," $3}' $dataSource | more;
fi;;
4) CheckDataSourceFileExist;
if [ $? -ne 1 ]
then
echo "当前的所有的用户的用户名和用户ID如下所示:";
echo -e "用户名 \t ID";
awk -F ":" '{print $1 "\t " $3}' $dataSource | more;
fi;;
5) CheckDataSourceFileExist;
if [ $? -ne 1 ]
then
keyWords="";
while [ -z $keyWords ]
do
echo -n "输入搜索关键词:";
read keyWords;
if [ -z $keyWords ]
then
echo "搜索关键词不能为空,请重新输入!";
fi
done
CheckDataSourceFileExist;
if [ $? -ne 1 ]
then
grep -i $keyWords $dataSource;
if [ $? -eq 1 ]
then
echo "很遗憾,【$dataSource】文件中,并不存在与 $keyWords 一致的信息。";
fi
fi
fi;;
6) $AddUser ;;
7) $DeleteUsers ;;
Q) printf "程序已经退出。";;
q) printf "程序已经退出。";;
*) echo $choice ":此选项不是默认提供的功能。请确认。";;
esac
fi
echo -n "确认??";
read ;
fi
done
2、ADD脚本文件代码
#!/bin/bash
#添加用户
dataSource=/home/luzy/practice2/passwd
clear;
isContinue="y";
userName="";
while [ $isContinue = "y" -o $isContinue = "Y" ]
do
#用户名处理,输入一致到字符串长度不为0为止
userName="";
while [ -z $userName ]
do
echo -n "用户名:";
read userName;
if [ -z $userName ]
then
echo "错误!用户名是不能为空的,请重新输入!";
continue;
fi
if [ `expr match $userName "[a-zA-Z][0-9a-zA-Z]*"` -ne `expr length $userName` ]
then
echo "错误!用户名的只能由非数字打头的字符和数字组成,请重新输入!";
userName="";
continue;
fi
done
#密码处理:1.验空,3.密码长度要6位,由大小写字母、数字和控制字符组成,2.验两次输入的一致性,
passWord="";
passWordAgain="";
while [ -z $passWord ]
do
echo -n "密码:";
read passWord;
if [ -z $passWord ]
then
echo "错误!密码是不能为空的,请重新输入!";
continue;
fi
if [ `expr length $passWord` -ne 6 ]
then
echo "密码长度为6位,请重新输入!";
passWord="";
continue;
fi
if [ `expr match $passWord "[0-9a-zA-Z]*"` -ne `expr length $passWord` ]
then
echo "密码由大小写字母、数字和控制字符组成,请重新输入!";
passWord="";
continue;
fi
echo -n "请在输入一次密码:";
read passWordAgain;
if [ $passWordAgain != $passWord ]
then
echo "两次输入的密码不一样,请重新输入!";
passWord="";
continue;
fi
done
#用户UID输入处理,UID为数字、一般非超级用户的ID大等于500
uID="";
while [ -z $uID ]
do
echo -n "用户UID:";
read uID;
if [ -z $uID ]
then
echo "错误!用户UID是不能为空的,请重新输入!";
continue;
fi
if [ `expr match $uID "[0-9]*"` -ne `expr length $uID` ]
then
echo "错误!用户的UID必须为数字,请重新输入!";
uID="";
continue;
fi
if [ $uID -lt 500 -o $uID -gt 60000 ]
then
echo "错误!一般非超级用户的ID范围为500~60000,请重新输入!";
uID="";
continue;
fi
done
#用户组GID处理
gID="";
while [ -z $gID ]
do
echo -n "用户组GID:";
read gID;
if [ -z $gID ]
then
echo "错误!用户GID是不能为空的,请重新输入!";
continue;
fi
if [ `expr match $gID "[0-9]*"` -ne `expr length $gID` ]
then
echo "错误!用户的GID必须为数字,请重新输入!";
gID="";
continue;
fi
if [ $gID -lt 500 -o $gID -gt 60000 ]
then
echo "错误!用户组的ID范围为500~60000,请重新输入!";
gID="";
continue;
fi
done
echo -n "说明:";read note;
#bash,sh,csh,ksh
shellVersion="";
while [ -z $shellVersion ]
do
echo -n "登录SHELL(bash,sh,csh,ksh):";
read shellVersion;
if [ $shellVersion != "bash" -a $shellVersion != "sh"
-a $shellVersion != "csh" -a $shellVersion != "ksh" ]
then
echo "输入的Shell类型【$shellVersion】不在本系统支持范围内,请重新输入!";
shellVersion="";
fi
done
echo -n "用户工作目录:";
mkdir /home/$userName;
if [ $? -eq 0 ]
then
echo $userName "成功创建!";
fi
userInfo="${userName}:${passWord}:${uID}:${gID}:${note}:${userName}:${shellVersion}";
echo "$userInfo" >> ${dataSource};
if [ $? -eq 0 ]
then
echo "$userName用户信息添加成功!";
else
echo "$userName用户信息添加失败!";
fi
echo -n "是否继续添加其他用户??(y/n)";
read isContinue;
done
3、DELETE脚本文件代码
#!/bin/bash
#删除用户
clear;
dataSource=/home/luzy/practice2/passwd
CheckDataSourceFileExist()
{
if [ -f $dataSource ]
then
#文件存在
return 0;
else
#文件不存在
clear;
echo -n "警告 【$dataSource】 不存在!请确认!";
read ;
return 1;
fi
}
isContinue="y";
userName="";
while [ $isContinue = "y" -o $isContinue = "Y" ]
do
while [ $isContinue = "y" -o $isContinue = "Y" ]
do
echo -n "输入用户的名称:";
read userName;
if [ -z "$userName" ]
then
echo "用户名不能为空,请重新输入!";
isContinue="Y";
continue;
fi
CheckDataSourceFileExist;
if [ $? -ne 1 ]
then
deleteUser=$(awk -F ":" '$1 == "'$userName'" { print $0 }' $dataSource);
if [ $deleteUser ]
then
echo "目标帐号确认:" $deleteUser;
echo -n "是否删除该信息??(y/n)";
read isContinue;
if [ -z $isContinue ]
then
isContinue="N";
fi
if [ $isContinue = "y" -o $isContinue = "Y" ]
then
CheckDataSourceFileExist;
if [ $? -ne 1 ]
then
rowID=$(grep -n $deleteUser $dataSource | awk -F ":" '{print $1}');
sed -e "$rowID d" $dataSource > tempFile;
cat tempFile > $dataSource;
rm tempFile;
fi
if [ $? -eq 0 ]
then
echo "删除成功!";
else
echo "系统错误,删除失败!";
fi
isContinue="N";
fi
else
echo "你输入的 【$userName】 用户不存在!";
isContinue="N";
fi
fi
done
if [ -n "$userName" ]
then
echo -n "是否继续删除其他用户??(y/n)";
read isContinue;
if [ -z $isContinue ]
then
isContinue="N";
fi
fi
done
4、passwd文件
raccoon:123321:600:700:nothing:raccoon:sh
wangjun:000000:601:701:gogo:wangjun:sh
English:888888:602:702:Hi:English:sh
一、批量创建用户
批量创建1000个用户
用户名为:班级+学号+昵称;每个班为一个组群
能够自动删除所创建的用户
每成功创建或删除一个用户,在屏幕上显示用户名
#!/bin/bash
echo "==========create the group=========="
read -p "input the groupname what you want to create:" a
A=`cut -d: -f1 /etc/group|grep $a|wc -w`
if [ $A -eq 1 ]
then
echo "groupname already exist,please go ahead"
else
groupadd $a
fi
echo "==========how many users you want to add=========="
read -p "input the numbers of users: " num
count=1
while [ $count -le $num ]
do
B=`cut -d: -f1 /etc/passwd|grep ${a}Student$count|wc -w`
if [ $B -eq 1 ]
then
echo "The user ${a}Student$count is already exist!"
else
useradd -G $a ${a}Student$count
echo "user ${a}Student$count add successfully"
fi
count=$(($count + 1))
done
read -p "do you want remove the new users? y or n: " do
let count=count-1
if [ "$do" = y ]
then
for(( count; count >= 1;count-- ))
do
userdel -r ${a}Student$count
echo "user ${a}Student$count del successfully"
done
else exit
fi
二、批量创建目录和文件
目录名为:dir1, dir2, …, dir10
每个目录下分别新建10个文本文件,文件名为:目录名+file1~10
并设置每个文件的权限:
文件所有者:读+写+执行
同组用户:读+执行
其他用户:读+执行
等待键盘输入一个数字,范围为1~10
重命名该级目录(假设输入数字为“5”,则为“dir5”目录)下所有文件的扩展名为bak,并将该目录下所有文件名保存到一个文本文件
删除包含该数字的所有目录和文件
#!/bin/bash
#
# 目录名为:dir1, dir2, …, dir10
# 每个目录下分别新建10个文本文件,文件名为:目录名+file1~10
# 并设置每个文件的权限:
# 文件所有者:读+写+执行
# 同组用户:读+执行
# 其他用户:读+执行
# 等待键盘输入一个数字,范围为1~10
# 重命名该级目录(假设输入数字为“5”,则为“dir5”目录)下所有文件的扩展名为bak,
# 并将该目录下所有文件名保存到一个文本文件
# 删除包含该数字的所有目录和文件
function addFile(){
for((i=1;i<=10;i++))
do
mkdir /usr/src/dir$i
chmod 755 -R /usr/src/dir$i
for((j=1;j<=10;j++))
do
touch /usr/src/dir$i/dir${i}file$j
done
done
}
read -p "which files(1~10) do you want to option:" num
addFile
ls /usr/src/dir$num >> /usr/src/fileOut.txt
#mv /usr/src/dir$num/dir${num}file* /usr/src/dir$num/dir${num}file*.bak
cd /usr/src/dir$num
for f in `ls /usr/src/dir$num`
do
mv $f $f.bak
done
echo "option successfully"
read -p "are you sure to remove this directory which with this number:" op
case $op in
y)
rm -rf /usr/src/dir$num ;;
*)
exit;;
esac
三、定时备份文件
每天18:00归档/etc目录下的所有文件,归档文件名为如下形式:etc-YYYY-MM-DD;保存在/home/user/backup目录下,其中user为当前登录用户名
需要编写一个脚本,放到/etc/cron.d/script :
#!/bin/bash
DATE=`date +%F`
tar -cvf /etc-$DATE /etc
mkdir /home/$USER/backup
mv /etc-$DATE /home/$USER/backup
四、查找统计
查看/etc/passwd中所有包含字符串“aa”的用户,并将结果保存在文本文件中
grep "aa.*" /etc/passwd|cut -d: -f1 >file
查看/bin中包含字符串“ls”的文件名,并将结果保存在文本文件中
ls /bin|grep "ls.*" >file
把/bin和/sbin下的文件名保存到文件commandview中
ls /bin /sbin >commandview
统计/bin和/sbin下的文件数量
ls /bin |wc -l
ls /sbin|wc -l
脚本代码:
#!/bin/bash
#查看/etc/passwd中所有包含字符串“aa”的用户,并将结果保存在文本文件中
grep "aa.*" /etc/passwd|cut -d : -f1 >> /home/luzy/practice1/text/file1
echo ‘******************’ >> /home/luzy/practice1/text/file1
#查看/bin中包含字符串“ls”的文件名,并将结果保存在文本文件
ls /bin |grep "ls.*" >> /home/luzy/practice1/text/file1
echo ‘******************’ >> /home/luzy/practice1/text/file1
#把/bin和/sbin下的文件名保存到文件command中
ls /bin /sbin >> /home/luzy/practice1/text/command
#echo ‘******************’ >> /home/luzy/practice1/text/file1
#统计/bin和/sbin下的文件数量
ls /bin | wc -l >> /home/luzy/practice1/text/file1
ls /sbin | wc -l >> /home/luzy/practice1/text/file1
五、加减乘除运算
两个操作数和一个运算符由位置参数给出 在屏幕上分别显示操作数、运算符和运算结果
#!/bin/bash
read -p "input first num: " a
read -p "input +-*/ : " b
read -p "input second num: " c
jg=`echo "scale=2; $a $b $c"|bc`
echo " $a $b $c = $jg "
echo "========================================================================="
read -p "Do you want to continue? y/n:" C
case $C in
y) sh ys.sh;;
n) exit;;
esac
六、按照运行结果编写Shell程序:
0
101
21012
3210123
432101234
54321012345
6543210123456
765432101234567
87654321012345678
9876543210123456789
#!/bin/bash
for ((i=0;i<=9;i++))
do
j=$i
for ((j;j>=0;j--))
do
echo -n "$j"
done
k=1
for ((k;k<=i;k++))
do
echo -n "$k"
done
echo
done
七、逆序输出一个字符串
#!/bin/bash
#逆序输出一个字符串
read -p "please input string:" str
echo "$str" | rev
八、冒泡法对10个数按升序排序
#!/bin/bash
#冒泡排序十个数
for((i=0;i<=9;i++))
do
#使用内置随机变量产生十个1000以内的数
arr[i]=$(($RANDOM%1000))
done
echo "${arr[@]}"
function fm(){
for((a=0;a<=9;a++))
do
for((b=a+1;b<=9;b++))
do
if [[ ${arr[a]} -gt ${arr[b]} ]]
then
x=${arr[a]}
arr[$a]=${arr[b]}
arr[$b]=$x
fi
done
#echo "${arr[a]}"
done
echo "${arr[@]}"
}
fm
九、编写一个menu的Shell程序,执行后的界面为:
NumberNameFor Linux Menu
1exitleave
2viedit a file
3datedate
4calcalendar
5wholist the users
6lslist the files in this directory
7catdisplay a file on the screen
Please input a number or a name for the action you wish:
#!/bin/bash
echo "NumberNameFor Linux Menu"
cat << EOF
1 exitleava
2 viedit a file
3 datedate
4 calcalendar
5 wholist the users
6 lslist the files in this directory
7 catdisplay a file on the screen
EOF
read -p "Please input a number or a name for the action you wish:" num
case $num in
1) exit;;
2) read -p "Input a filename:" A
vi $A;;
3) date;;
4) cal;;
5) cut -d: -f1 /etc/passwd;;
6) ls -la .;;
7) read -p "Input a filename:" B
cat $B;;
esac
echo "========================================================================="
read -p "Do you want to continue? y/n:" C
case $C in
y) sh menu.sh;;
n) exit;;
esac
十、求n的阶乘
#!/bin/bash
#求n的阶乘
#方法一
function mathod1(){
a=1
for((i=1;i<=num;i++))
do
a=` expr $i \* $a `
done
echo "${num}! = $a"
}
#方法二
function m2(){
if [ $1 -eq 1 ]
then
echo "1"
else
local x=$[ $1 -1 ]
local y=`m2 $x`
a=`expr ${x} \* ${y}`
# echo " $[ $1 - 1 ]! = ${a}"
echo "$a"
fi
}
read -p " please input a number(>0):" num
read -p " which mathod you chose(1 or 2) :" m
case $m in
1)
mathod1 ;;
2)
re=`m2 $[ $num + 1 ]`
echo "${num}!= $re";;
*)
echo "no such mathod!"
;;
esac