(一)创建文件 File1、File2、File3,依次设置 710、741、751 的数字权限;取消File1 的同组账户可执行权限、取消 File2 的同组账户可读权限、取消 File3 的其他账户可执行权限
(1)设置数字权限
查看改变权限前的文件权限情况:
赋予如下格式命名:chmod 710 File1
,不同文件按照对应要求即可:
可以发现,710
数字权限增加了File1
的属主和同组的可执行权限;741
数字权限增加了File2
的属主与其他用户的可执行权限;751
增加了File3
属主、同组以及其他用户的可执行权限。
(2)设置账户组相关权限
采用命令chmod g-x File1
取消File1 的同组账户可执行权限:
采用命令chmod g-r File2
取消 File2 的同组账户可读权限:
采用命令chmod o-x File3
取消 File3 的其他账户可执行权限:
效果与(1)的整体操作相反。
(二) 分别手工启动前台、后台进程;利用 at 命令调度启动一个作业
(1)前后台执行
以ls
为例说明,前台执行ls命令,即直接在终端输入并回车,此时在该进程进行时无法进行其他操作;执行后台进程,则在命令后添加&
标识符,此时ls在执行的同时,还能同时执行其他命令如w
:
(2)at
定时指令
创建可执行脚本如下:
#!/bin/bash
curl https://dgzc.ganahe.top >> ~/linuxLearn/chowd/atDemand.txt
采用curl指令获取网页内容并重定向输入到文件中。
通过指令at 01:32 today -f atAutobash.sh
实现定时执行上述脚本:
通过指令atq
或是at -l
查看作业列表:
在指定时间后,输出的文件列表对比如下:
执行前 | 执行后 |
---|---|
指向的文件atDemand.txt
已生成且内容如下:
(三)编程提示输入两个单词,然后比较这两个单词。如果两个单词相同则显示“Match”,否则显示“Not match”,最后显示“End!”(if 控制结构)
主要思路:执行脚本后,由用户于输入两个单词,随后采用字符串的比较运算符实现比较。
为了输出信息更为全面与清晰,更能把握到条件判断与选择的细节,故在原题指定要求的输出上,做了一定的调整,编辑脚本如下:
#!/bin/bash
echo " welcome to use my shell's Script @by GanAHE"
echo "--------- the procedure running ------\n "
read -t 20 -p "please input two strings which splited by black:" str1 str2
echo - Do Words: {str1} ={str2} ?
if [ str1 =str2 ];then
echo '- Match '
elif [ str1 \>str2 ];then
echo "- Not match, the bigger one is:{str1}"
else echo "- Not match, the bigger one is:{str2}"
fi
echo ------ end! ------
采用read
的-t
参数,设置输入时限,避免进程拥塞,同时-p
参数可以在输入前给出提示,提升交互效果。
采用if
进行条件选择判断,结果如下:
(四)编程创建一个简单的菜单,屏幕显示如下:
a. Date:
b. User:
c. The working directory
Enter a,b or c:
根据用户输入选项做相应操作(case 控制结构)
(1)分析与设计
根据菜单设计的要求,当用户键入a
时,输出系统数据情况如内存使用、进程占用等数据;键入b
时,输出当前用户以及所有用户;键入c
时,给出当前的工作路径。
分析如上需求,只需判断用户输入的内容去选择处理即可,同时增设不同的参数输入时的提示与说明等功能:
#!/bin/bash
echo "\n welcome to use this Script @copyright by GanAHE"
ind="no"
while [ ind != "quit" ]
do
echo "\n---------- the system of monitor under Linux -----\n make a choise to get somthing:\na.Date:\nb.User:\nc.The working directory\nEnter a , b or c: "
read op
ind=op
case "${op}" in a)
free -m
echo "-------------------------------"
df -h
;;
b)
echo -n " - You are: "
whoami
echo " - All user:"
w | head
;;
c)
echo -n " - now directory is: "
pwd
;;
*)
echo " * Input Error! Please input correct option! \n * You can input 'quit' to exit process"
esac
done
echo "\n----------- End! -----------"
(2)效果
首先是执行普通选项(a、b、c):
当输入错误选择字符或是退出程序选项时:
动态展示效果如下:
(五) 输入分数 score,如果大于等于 60 分并且小于 80 分,输出“成绩良好”;如果大于等于 80 分,输出“成绩优秀”;如果小于 60 分,输出“成绩不及格”
主要涉及整数的条件判断与选择问题,设计的程序如下:
#!/bin/bash
echo "Welcome to use my Script @copyright @GanAHE"
echo
read -p " - Please input your score:" sc
if [ {sc} -ge 80 ];then
echo"成绩优秀"
elif [{sc} -lt 80 ]&&[ ${sc} -ge 60 ];then
echo " 成绩良好"
else echo " 成绩不及格"
fi
echo
echo "----------- end! -----------"
输出结果:
(六) 编程实现加法、乘法运算、奇偶数判断
(1)设计
题目要求实现基本的数据运算,需要用到exrp、let
等脚本内部数据运算命令,随后还有数据类型判断等,将全部要求集成:
#!/bin/bash
echo "Thanks to use my Script @copyright by GanAHE"
echo
echo "choice the function: a.calculator(or any char); b. Judge parity"
read -p " - Please input your choice: " cs
#Judge parity
if [ cs = b ];then
read -p"- Plese input an integer:"integer
let op=integer%2
if [op -eq 0 ];then
echo "the value: integer is even number!"
else echo "the value:integer is odd number!"
fi
# calculator
else
read -p " - Please input the first number: " num1
read -p " - Please input the second number: " num2
read -p " - Please input the second operator(\"+\", \"-\", \"*\", \"/\"): " op
#if的另一种格式,不仅仅局限于if [a ^ b ];then
if [ -n "num1" -a -n "num2" -a -n "op" ]
then
# 1.check the value
test1=(echo num1 | sed 's/[0-9]//g')
test2=(echo num2 | sed 's/[0-9]//g')
if [ -n "test1" -o -n "test2" ]
then
echo "Please input number."
exit 1
fi
# 2.check the sign of calculation
caseop in
"+")
result=((num1 + num2))
;;
"-")
result=((num1 -num2))
;;
"*")
result=((num1 * num2))
;;
"/")
result=((num1 /num2))
;;
*)
echo "Please input correct operator, like \"+\", \"-\", \"*\", \"/\"."
exit 2
;;
esac
# 3. print the result
echo "num1op num2 =result"
exit 0
else
echo "Number and oprator must not be empty"
exit 3
fi
fi
(2)效果
基本数据运算如下:
奇偶性判断效果:
(七)编程实现 n 的阶乘,n=10
(1) 设计
计算阶乘是一类比较的实用功能,可以设计为:把整个文件当作一个函数来用,直接在命令行输入,就像内置的各种命令一样:
#!/bin/bash
echo " -------- Thanks to use my Script @copyright by GanAHE ---------- "
num=1
#echo sfddg1 2
exprnum + 1 &>/dev/null
[ ? -ne 0 ] && echo "please input a number." && exit 2
[# -ne 1 ] && echo 'Usage:0 number' && exit 1
[num -le 0 ] && echo "please input a number bigger than 0" && exit 3
s=1
for i in `seq 1 num`
do s=((s*i))
done
echo "- result: $s"
(2)效果
经过多次测试与调整,最终结果如下:
(八) 编写 shell 脚本,实现分段函数求值。分段函数如下:
要求利用多分支 if 条件语句和 for 循环语句实现,并分别输出 x=-5,-3,-1,1,2,3,5 时的值。
(1)主要设计
将分段函数设计成脚本函数形式,通过外部数据传入与调用可以实现函数多次使用,设计如下:
#!/bin/bash
echo "-------- Start ----------"
echo
# Function
func() {
local t=1
local y=0
if [t -ne -3 ]&&[ t -lt 0 ];then
let y=t*t+t-6
elif [ t -ne 2 ]&&[t -ne 3 ]&&[ t -lt 5 ]&&[t -ge 0 ];then
let y=t*t-t*5+6
else let y=t*t-t+1
fi
echo " ---------the result: y"
echo
}
# Entrance
x=(5 -3 -1 1 2 3 5)
for i in{x[@]}
do
echo " - when the value is: x={i}"
funci
done
echo "--------- end! ---------"
(2)效果
输出结果如下:
总结
本次实践主要为Linux系统下权限与监视管理、Shell脚本编程的综合应用,一方面可以熟悉相关的原理与知识,另一方面可以用来初步探索脚本的现实应用。
脚本的可执行可以直接通过sh 文件名、bash 文件名、./文件名(需要提前赋予可执行权限)的方式执行,此实践联系了终端单行命令与脚本集成命令、权限与程序设计等,体验到了三种方式的区别与相同点,比如大多数命令均可执行但sh可能不支持echo的换行符等。
条件选择与循环是程序的基础构成之一,以上实践也比较好地运用到了这些语句,提高了程序的灵活性与可执行性。
当然,shell脚本的变量引用与传递、数据的处理与计算等远没有现今流行的Java、C/C++、Python等好用,引用指令不够自然,参数多样化且含有许多字符等,这也是一个不太方便和难以快速学习掌握的一点,也要求我们多加以思考、练习去真正掌握shell的相关知识与应用。
Comments NOTHING