CentOS -简单shell

作业(练习)内容:

1、描述shell程序的运行原理(可附带必要的图形说明);

Shell(外壳):交互式进程。编译器,解释器

shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。

2、总结shell编程中所涉及到的所有知识点(如:变量、语法、命令状态等等等,要带图的哟);

面向对象:把整个我们要实现的项目抽象成一个一个的对象并且定义对象之间的动作

面向过程:把编程着源点立足点主要在问题解决过程本身

脚本或程序源文件:文本文件

两种方式:

编译执行:预处理-->编译-->汇编-->链接;事先完成,结果:二进制程序文件C, C++

解释执行:由解释器全程参与运行过程,每次读取一行,运行一行;

程序:指令+数据

算法+数据结构

过程式编程:以指令为中心,设计算法,数据服务于算法;

对象式编程:以数据为中心,设计数据结构(类),程序服务于数据结构;

bash过程式编程:

顺序执行:逐个执行

选择执行:只执行其中一个分支

循环执行:一段代码要执行0,1或多遍

编程元素:变量、流程、函数

变量:可变化的量,命名内存空间

bash环境:

本地变量:当前shell进程;

name=value

name: 变量名

=:赋值符号

value:值

变量名:只能包含数字、字母和下划线;且不能以数字开头;

引用变量:${name}, $name

弱引用: "", 其内部的变量引用会被替换为变量值;

强引用:‘‘,其变量的变量引用会保持原有字符;

命令引用:`COMMAND`,$(COMMAND),引用命令的执行结果;

声明为整型:

declare -i name[=value]

letname=value

环境变量:当前shell进程及其子进程;

被”导出”的本地变量

exportname[=value]

declare-x name[=value]

查看所有环境变量:env, printenv, export

销毁:

unsetname

局部变量:某个函数执行过程;

位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;

特殊变量:$?, $*, [email protected], $#, $$

变量类型:

数值:整数,浮点数

字符:ASCII

作用:存储空间,运算,存储格式

脚本:文本文件

脚本运行,事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑,而后bash解析并运行此逻辑

启动脚本:

(1)#bash /PATH/TO/SCRIPT_FILE

(2)一个执行权限

#./PATH/TO/SCRIPT_FILE

第一行:顶格给出shebang

注释行:#

bash的常用选项:

-n:检查脚本中的语法错误;

-x:调试执行脚本;

条件测试:

界定程序执行环境;

(1) 根据运行的命令的状态结果;

(2) 测试表达式

testEXPRESSION

[EXPRESSION ]

[[EXPRESSION ]]

整数测试:隐含着做数值大小比较,所以不要给变量引用加引用;

$A-gt $B:是否大于;是则为“真”,否则为“假”;

$A-ge $B: 是否大于等于;

$A-lt $B:是否小于;

$A-le $B: 是否小于等于;

$A-eq $B: 是否等于;

$A-ne $B:是否不等于;

[[email protected] bin]# A=3
[[email protected] bin]# B=8
[[email protected] bin]# [ $A -gt $B ]
[[email protected] bin]# echo $?
1

符串测试:ASCII数值越大,字符比较时其值越大;

"$A"> "$B":是否大于;

"$A"< "$B":是否小于;

"$A"== "$B":是否等于;

"$A"!= "$B":是否不等于;

-z"$A":是否为空;空则为“真”,否则为“假”

-n"$A":是否不空;不空则“真”,空则为“假”

[[email protected] bin]# A=3
[[email protected] bin]# B=8
[[email protected] bin]# [ "$A" != "$B" ]
[[email protected] bin]# echo $?
0
[[email protected] bin]#

注意:应该使用[[ EXPRESSION ]]

文件测试:测试文件的存在性以及属性;

-e$file: 是否存在;存在则为“真”,否则为“假”;

-a$file: 同上;

-f$file:文件是否存在且为普通文件;

-d$file:文件是否存在且为目录;

-h$file:是否存在且为符号链接文件;

-L$file: 同上

-b$file:是否存在且为块设备文件;

-c$file:是否存在且为字符设备文件;

-S$file:是否存在且为套接字文件;

-p$file: 是否存在且为管道文件;

[[email protected] bin]# [ -e /etc/fstab ]
[[email protected] bin]# echo $?
0

-r$file: 当前用户对文件是否拥有读权限;

-w$file:当前用户对文件是否拥有写权限;

-x$file:当前用户对文件是否拥有执行权限;

[[email protected] bin]# [ -r /etc/fstab ]
[[email protected] bin]# echo $?
0
[[email protected] bin]# [ -w /etc/fstab ]
[[email protected] bin]# echo $?
0
[[email protected] bin]# [ -x /etc/fstab ]
[[email protected] bin]# echo $?
1

-u $file:文件是否拥有SUID权限;

-g$file:文件是否拥有SGID权限;

-k$file:文件是否拥有sticky权限;

-O$file: 当前用户是否为指定文件的属主;

-G$file: 当前用户是否为指定文件的属组;

双目操作符:

$file1-nt $file2: file1是否新于file2, file1的最近一次的修改时间戳是否晚于file2的;

$file1-ot $file2: file1是否旧于file2, file1的最近一次的修改时间戳是否早于file2的;

$file1-ef $file2:file1与file2是否指向了同一个inode;测试二者是否为同一个文件的硬链接;

特殊设备:

/dev/null:空,bit buckets,吞下所有数据,并直接丢弃;

/dev/zero:吐出一N多个0;

特殊变量:

$?:命令的状态结果;

$#:传递给脚本或函数的参数的个数;

$*和[email protected]: 引用传递给脚本或函数的参数列表;

shift[n]:轮替

bash之条件判断(选择执行):

if/then,case

[[email protected] bin]# vi 1.sh
#!/bin/bash
#
username=user1
if ! id $username &> /dev/null; then
   useradd $username
   echo $username | passwd--stdin $username &> /dev/null
fi

while, until

3、总结课程所讲的所有循环语句、条件判断的使用方法及其相关示例;(if (jpg|png is not exist);echo ”You say a XX“)

循环语句:for, while, until

for 对一段语句重复读取执行,一般均设置一个退出或进入循环的条件来控制循环的次数

for语法:

for 变量名 in 列表;do

循环类容

done

进入条件:列表非空

退出条件:列表遍历结束

循环语句:

         for,
         #!/bin/bash
for username in$(cut -d: -f1 /etc/passwd); do
                            echo "$username primary group:$(id -n -g $username)."
Done
Until

until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。

until 循环格式为:

until command

do

Statement(s) to beexecuted until command is true

done

command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

例如,使用 until 命令输出 0 ~ 9 的数字:

        #!/bin/bash
         a=0
         until [ ! $a –lt10 ]
         do
                   echo $a
                   a=expr$a + 1
         done

4、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;(不要怀疑,就是这么简单)

#!/bin/bash
#
filname="/tmp/s/d/testdit"
if [ -e $filname ]; then
         echo"$filname 已经存在"
         file $filname
else
         mkdir -p $filname
         echo "&dd$filname 完成"
fi

5、写一个脚本,完成如下功能;判断给定的两个数值,孰大孰小;给定数值的方法:脚本参数,命令交互;(使用read,依然如此简单)

#!/bin/bash
read -p "输入两个整数整数之间空格隔开:" -t 10 num1num2
if [ -z "$num1" ]; then
         echo "输入一个整数。"
         exit 1
fi
if [ -z "$num2" ]; then
         echo "输入一个整数。"
         exit 1
fi
if [ $num1 -ge $num2 ]; then
         echo "大: $num1, 小: $num2."
else
         echo "大: $num2, 小: $num1."
fi

6、求100以内所有奇数之和(至少用3种方法。是的这是我们的作业^_^)

#!/bin/bash
declare -i sum=0
for i in {1..100}; do
         if [ $[$i%2] -ne 0]; then
                   sum=$[$sum+$i]
         fi
done
echo "$sum"

#!/bin/bash
declare -i sum=0
for i in {1..100}; do
         if [ $[$i%2] -ne 0]; then
                   sum=$[$sum+$i]
         fi
done
echo "$sum"

7、写一个脚本实现如下功能:

(1) 传递两个文本文件路径给脚本;

(2) 显示两个文件中空白行数较多的文件及其空白行的个数;

(3) 显示两个文件中总行数较多的文件及其总行数;

8、写一个脚本

(1) 提示用户输入一个字符串;

(2) 判断:

如果输入的是quit,则退出脚本;

否则,则显示其输入的字符串内容;

9、写一个脚本,打印2^n表;n等于一个用户输入的值;(不好意思,我调皮了)

10、写一个脚本,写这么几个函数:函数1、实现给定的两个数值的之和;函数2、取给定两个数值的最大公约数;函数3、取给定两个数值的最小公约数;关于函数的选定、两个数值都将通过脚本参数进行输入。

时间: 2024-08-23 22:27:40

CentOS -简单shell的相关文章

CentOS下shell显示-bash-4.1#不显示用户名路径的解决方法

CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看到的[email protected]的组合,看起来很不舒服. 原因就是你创建用户的时候,如果指定了-M参数,而因此没有创建用户家目录,所以系统就不会在创建用户的时候,自动拷贝/etc/skel目录下的用户环境变量文件到用户家目录,也就导致这些文件不存在,出现-bash-4.1#的问题了,手动拷贝一下就行 解决方法一.未验证

基于u-boot源码的简单shell软件实现

一.概述 1.shell概念 Shell(命令解析器),它用于接收用户输入的命令,进行解析,然后调用相应的应用程序,为使用者提供了使用软件的界面. shell是操作系统最外面的一层.shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,执行相应的应用程序,并且输出各种各样的处理结果. 2.shell分类 按照界面类型,可以分为图形界面shell和命令行式shell. 图形界面shell(Graphical User Interface shell 即 GUI shell),应

简单shell指令

第一部分 简单的常用指令 1.date命令 date 2.显示日历 cal 3.显示当前目录 pwd  4.切换当前工作目录 默认情况下,超级用户的主目录是/root,而普通用户的主目录是/home下与该用户同的子目录. 超级用户,也就是root用户的显示符号为:# 而普通用户的显示符号为:$ 5.查看文件信息 ls -a 显示所有的文件和子目录,包括隐藏的文件和隐藏子目录,Linux中隐藏文件夹和隐藏子目录都是以“ . ”来开始的. -R 不仅显示指定目录下的文件和子信息目录,而且还递归的显示

简单shell 编程

简单shell编程  by  dreamboy 1 #!/bin/bash 2 while true 3 do 4 echo 5 clear 6 echo 7 echo " 系统维护菜单 " 8 echo "============================ " 9 echo " 1)显示系统日期 " 10 echo " 2)修改系统日期 " 11 echo " 3)显示已登录用户 " 12 echo

解决方案:centos运行shell脚本时报“$&#39;\r&#39;: 未找到命令”

=============================================== 2018/9/12_第1次修改                       ccb_warlock =============================================== 问题: 将vs code里编写好的sh脚本(tmp.sh)上传到服务器(centos),运行时报"$'\r': 未找到命令". 解决方案: 查了资料后才知道,由于该脚本的命令在windows上编辑后

CentOS下shell显示-bash-4.1$不显示用户名路径

Linux CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法. 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: -bash-4.1$ -bash-4.1$ \ 而不是我们经常看到的username@hostname的组合,看起来很不舒服. 解决方案: 问题的原因是因为没有配置.bash_profile的问题,可以通过配置这个文件来解决问题. 1.在Terminal输入: vi ~/.bash_profile 2.如果没有.bash_pro

【sehll学习】linux运维一个简单shell脚本监控系统内存

学习shell脚本入门后,慢慢要尝试编写一些脚本练练手,在这先简单的学习写个系统内存的监控. 1.首先先要确定一下截取一下需要关注的内存使用值,可使用free 命令来操作 free -m 显示 一般在监控内存是我们都是截取 第三行(-/+ buffers/cache)的值.确定后可以使用管道线和grep命令来获取这个的值. free -m | grep - | awk  '{print $4}' 获取到他的值为  858 当中 grep -  就是匹配一下要选取的内容,不太熟悉的可以学习一下gr

Centos RSync+Shell实现数据定时同步

我们前面介绍了几篇关于Centos相关服务安装及配置,今天我们主要介绍如何实现本地与远程计算机的数据目录同步,在我之前bolg中有一篇通过shell实现本地与远程计算机的数据同步的文章,通过shell同步实现指定目录的复制及覆盖操作不是那么的方便,因为复制目录及覆盖目录只会增量,不会减量,比如:原来的本地有一个目录下的abc.txt被同步到了远程计算机的指定目录后,当本地目录下的abc.txt文件删除后,远程计算机同步目录下的abc.txt依然存在,所以这样导致数据信息不准确,今天了我们为了解决

一个具有菜单选项的简单shell脚本

这是一个简单的shell脚本,里面包含了很多的shell脚本编写技巧,虽然脚本是从别的视频教程里面整理而来,但是对我的以后的编写shell脚本的道路有了一定的铺垫. #!/bin/bash ############# # main menu # ############# main_menu () { echo echo dis_mainmenu="CREATE MINISITE IN CHINAITLAB.COM" curdate=`date "+%Y-%m-%d %T&q