linux vip shell,linux--shell

Linux shell

1、shell的概念

1)shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序界面的系统级程序。

用户可以通过shell来启动、挂起、停止。甚至编写一些程序。

2)它还是一个功能强大的编程语言,易编辑,易调试,灵活性强。shell是结核性的脚本语言,在我们

shell中可以直接调用linux系统命令。

外层应用程序

|

shell命令解释器 --》转换

|

内核

|

硬件 --》010101010....机器语言

#! shebang

如果脚本文件中没有#!这一行,那么它执行时会默认用当前Shell去解释这个脚本(即:$SHELL环境变量)

2、shell执行的原理

1)在我们计算机语言中,最底层是硬件,硬件是通过内核进行管理的。内核通过管理硬件进行功能的实现,但是在计算机语言里底层硬件只能识别0101...的机器语言,无法识别a,b,c,asc码语言。在这中间就需要一个翻译机制进行编译,就是所谓的shell编辑器, shell编辑器可以讲外层输入的asc码翻译成计算机能识别的机器语言,所以说内核要通过shell编辑器进行翻译才能对硬件进行管理。

2)反之,硬件要将输入的请求响应给外层应用,那么我们内核是无法识硬件的机器语言,那么这时shell编辑器也会将硬件处理的机器语言翻译成ascll语言给内核,内核再进行shell编辑器反馈给外层应用。最后就会得到我们想要的结果了

3、Linux中支持的shell环境

[[email protected] ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

4、shell脚本的执行方式

. shell.sh

sh shell.sh

./shell.sh (必须要有X权限才可以操作) chmod u+x shell.sh

6、变量

1)环境变量

系统环境(全局):cat /etc/profile

用户环境变量(局部):cat .bash_profile ,root修改后,beifeng也是不能使用的

这两类文件别轻易修改

2)位置变量

获取脚本文件时所传入的参数,将传入的参数保存在位置变量中,以便于在脚本中可以使用这些变量。

$1,$2,$3,$4,$5,$6,$7,$8,$9,${10},${11}.....

编写位置变量:

[[email protected] sh]# vi 1.sh

#!/bin/bash

echo $2

echo $3

echo $1

调用脚本并且传入参数

[[email protected] sh]# sh 1.sh start stop restart

stop

restart

start

3)预定义变量

$0 显示脚本名称

$! 进程中的PID号,每一个进程都有一个编号

$$ 当前进程的id号

$# 当前传入shell的参数个数

$* 整体打印参数

[email protected] 逐个显示参数内容

$?判断表示程序退出的代码 (返回0表示成功,非0表示失败)

6、4)自定义变量

语法格式:name=[value]

注意:

变量对大小敏感

等号两边不能有空格

定义好之后用($变量名)调用变量

用法:a=12

echo $a

5、逻辑符号

&&:逻辑与

cmd1&&cmd2:表示前一个执行成功后,才会执行后面的命令

如:# cat /etc/passwrd && mkdir test(不执行第二个命令)

# cat /etc/passwd && mkdir test(执行第二个命令)

||:逻辑或

cmd1||cmd2:表示前面一个命令执行失败,才会执行后面的命令

如:# cat /etc/passwrd || mkdir hello

;没有逻辑 (无逻辑)

cmd1;cmd2

顺序执行

6、shell计算

# echo $((a+b))

# echo $[a+b]

# echo $(($a+$b))

# echo $[$a+$b]

# expr $a + $b 注意:加号前后要加空格

7、内置判断

数字判断:

-eq 等于则为真

-ne 不等于则为真

-gt 大于则为真

-ge 大于等于则为真

-lt 小于则为真

-le 小于等于则为真

数字:

a=11

b=12

[ $a -eq $b ];echo $?

字符串判断:

=:字符串内容相同则为真,就是说包含的文本一摸一样。

!=:字符串内容不同,则为真(!号表示相反的意思)

-z:字符串内容为空(长度为零)则为真

测试:

[ "as" = "aa" ];echo $?

[ "as" != "aa" ];echo $?

[ -z $a ];echo $?

[[email protected] shell]$ a="I am"

[[email protected] shell]$ echo $a

I am

[[email protected] shell]$ b="B am"

[[email protected] shell]$ [ $a = $b ];echo $?

-bash: [: too many arguments

2

[[email protected] shell]$ [ "$a" = "$b" ];echo $?

1

3)文件测试

-e 文件名 : 如果文件名存在即为真

-r 文件名 : 如果文件名存在且可读则为真

-w 文件名 : 如果文件名存在且可写则为真

-x 文件名 : 如果文件名存在且可执行则为真

! : 非

-a : and

-o : or

[ -e /etc/passwd -a 2 -eq 2 ];echo $?

[ -e /etc/passwd ];echo $?

7、for循环

#!/bin/bash

for i in tom tony leo

do

echo $i

done

【需求】使用for循环

#!/bin/sh

for MONTH in {1..12} //或者这里也可以写$(seq 1 12)

do

mkdir -p /opt/test/$MONTH

done

【需求】求1到10的和

#!/bin/bash

for((i=1;i<=10;i++))

do

SUM=$((SUM+i))

done

echo $SUM

【扩展】

使用延迟(有趣的进度条):

#!/bin/bash

b=‘‘

for ((i=0;$i<=100;i++))

do printf "Progress:[%-100s]%d%%r" $b $i

sleep 0.1

b=#$b

done

echo

2)if判断:

第一种写法:

if 条件判断

then

command.....

fi

eg.

[[email protected] sh]# vi test05.sh

#!/bin/bash

if [ 3 -eq 3 ]

then

echo Yes

fi

[[email protected] sh]# bash test05.sh

Yes

第二种写法:

if 条件语句

then

command ....

else

command ....

fi

eg.

[[email protected] sh]# vi test06.sh

#!/bin/bash

if [ -d /home/jerry/tmp ]

then

ls /home/jerry/tmp

else

mkdir /home/jerry/tmp

echo "目录创建成功"

fi

# sh test06.sh

目录创建成功

第三种写法:

if 条件语句

then

command...

elif 条件语句

then

command...

elif 条件语句

then

command...

....

else

command...

fi

eg.

#!/bi/sh

# read socre and choose level

# read 相当于Java中的scanner 是一种交互式命令,读取设备的输入

echo "请输入学生成绩score:"

read score

if test $score -ge 90;

then

echo level A;

elif [ $score -ge 80 -a $score -lt 90 ]

then

echo "level B";

elif test $score -ge 70 -a $score -lt 80

then

echo "level C";

elif [ $score -ge 60 ] && [ $score -lt 70 ]

then

echo "level D";

else

echo 不及格;

fi

8、while循环

【需求】求1到10的和

#!/bin/bash

i=1

while [ $i -le 10 ]

do

SUM=$((SUM+i))

i=$[i+1]

done

echo $SUM

【需求】读取文件内容

#!/bin/bash

while read -r line

do

echo $line

done < /etc/passwd

控制语句case语句

语法1:

case $变量名称 in

条件1)

命令序列

;;

条件2)

命令序列

;;

条件3)

命令序列

;;

*)

esac

例如:

#!/bin/bash

case $1 in

top)

top

;;

free)

free

;;

ls)

ls /opt/cmz

;;

*)

echo "usages: top|free|df"

esac

语法2:

case $变量名称 in

条件1|条件2)

命令序列

;;

条件3|条件4)

命令序列

;;

条件5|条件6)

命令序列

;;

*)

esac

例如:#!/bin/bash

case $1 in

cat|dog)

echo "animal"

;;

pen|pencil)

echo "study"

;;

*)

echo "usages: cat|dog|pen|pencil"

esac

十一、Linux中的定时任务

1、date

显示当前系统的时间

# date -s "2017-11-18 17:03:30"

# date "+%Y%m%d"

七天前

# date -d ‘7 day ago‘ ‘+%Y%m%d%H%M‘

2、at命令:定时计划任务

在特定的时间执行一次后结束

格式:at now+时间(相对于当前时间)

--at 时间(绝对时间:在当前时间之后的一个具体时间)

例如:at now+2minutes

at 10:26

步骤:at now+2minutes按回车键键入

at> mkdir /opt/test

at> 这时可以

--按Ctrl+d结束编辑

--# at -l:查看未执行的定时计划

3、Crontab计划任务

-->周期性执行计划任务

选项使用:

crontab -l (list ) #查看目前的计划任务列表

crontab -r (remove) #删除计划任务

crontab -e (eidt) #编辑周期性计划任务

进程名称是crond

ps -ef | grep crond $查看此进程是否开启

-》检查服务是否开启

# service crond status

# service crond start

# service crond stop

# service crond restart

-》执行身份管理员

-》注意:凡事只要涉及到服务相关的,都会有开机设置项

开启# chkconfig crond on

关闭# chkconfig crond off

-》执行身份管理员

cat /etc/crontab

***** user-name command to be executed

分时日月周命令

/ 表示频率

- 表示范围

, 表示指定执行

【假设场景】

每周三的凌晨两点

02**3cp /etc/passwd /tmp

每个月10号和25号凌晨1点5分

5110,25*******

每10分钟执行一次

#fzs#10*********

每天凌晨1点到6点

01-6********

每小时的第5分钟执行一次

5*********

每月8号的7:30分执行

3078*******

每年的6月8号5:30分执行

30586********

每天8到11点的第25分钟执行

258-11********

每小时的第5分钟和15分钟和25分钟执行

5,15,25 * * * * *******

【示例】

每分钟执行一次将结果写到一个文件中

#fzs#1 * * * * date >> /opt/test.txt

制定完成建议重启服务

# service crond restart

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值