linux之Shell编程1:Shell编程

目录

一. shell介绍

一. 例子实战

例子1:demo1.sh

例子2:demo2.sh


一. shell介绍

  • shell是一个用C语言编写的程序,它被称为用户使用linux的桥梁。
  • Shell既是一种命令语言,又是一种程序设计语言。
  • Shell 脚本(shell script),是一种为shell编写的脚本程序。

1. shell属于弱类型编程语言,其中:

  • 强类型:变量在使用前,必须事先声明,甚至还需要初始化;
  • 弱类型:变量用时声明,甚至不区分类型;

2. 变量赋值,引用

  • 赋值:VAR_NAME=VALUE
  • 引用:${VARNAME} (花括号一般可以省略)
  • 例如下面例子:
# 显式地直接赋值(可以重复为变量赋值):
zhangkf@wang-ThinkStation-P520:~$ name="hello"
# 使用一个定义过的变量,只要在变量名前面加美元符号即可,如

zhangkf@wang-ThinkStation-P520:~$ echo $name
hello
zhangkf@wang-ThinkStation-P520:~$ echo ${name}
hello
# 变量名外面的花括号是可选的,加不加都行。
# 加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
zhangkf@wang-ThinkStation-P520:~$ name="zhang"
zhangkf@wang-ThinkStation-P520:~$ echo "beicai$name"
beicaizhang
zhangkf@wang-ThinkStation-P520:~$ echo "beicai${name}"
beicaizhang

3. 变量类型:(局部变量(常用)、环境变量)

  • 环境变量,该也称为系统变量。所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
export VARNAME=VALUE ; # 作用域为当前shell进程及其子进程。 
# 命令行中启动的脚本会继承当前shell环境变量; 系统自动执行的脚本(非命令行启动)
# 就需要自我定义需要的各环境变量;
zhangkf@wang-ThinkStation-P520:~$ JAVA_HOME=/usr/local/jdk7/
zhangkf@wang-ThinkStation-P520:~$ export JAVA_HOME
zhangkf@wang-ThinkStation-P520:~$ echo $JAVA_HOME
/usr/local/jdk7/
  • 本地变量
set VARNAME=VALUE: # 作用域为整个bash进程;(set关键字 可以省略)
  • 局部变量
local VARNAME=VALUE:# 作用域为当前代码段;(local 是关键字) 
  • 位置变量
$1,$2, ... # 位置变量是用来引用脚本的参数的
zhangkf@wang-ThinkStation-P520:~$ echo $?
0
zhangkf@wang-ThinkStation-P520:~$ lsss
未找到 'lsss' 命令,您要输入的是否是:
 命令 'less' 来自于包 'less' (main)
 命令 'lssu' 来自于包 'nilfs-tools' (universe)
lsss:未找到命令
zhangkf@wang-ThinkStation-P520:~$ echo $?
127
zhangkf@wang-ThinkStation-P520:~$


# 可以看出,当执行命令成功和失败时,$? 的值是不同的 
# 0: 正确执行 
# 1-255:错误执行;(1,2,127系统预留)
  • 注意:操作变量本身不需要加$符号;操作变量的值要加$符号

例如设置java环境变量:

zhangkf@wang-ThinkStation-P520:~$ JAVA_HOME==/usr/local/jdk7/
zhangkf@wang-ThinkStation-P520:~$ export PATH=$PATH:${JAVA_HOME}/bin
zhangkf@wang-ThinkStation-P520:~$ echo $PATH
/home/zhangkf/bin:/home/zhangkf/.local/bin:/usr/local/cuda-9.0/bin:/bin:=/usr/local/jdk7//bin
zhangkf@wang-ThinkStation-P520:~$
# 当然这样只是临时的,退出当前shell后就失效了在文件开头加上 #!/bin/bash 就行了 
#! 叫 shebang(魔数) ,用来指定脚本解释器的路径,所以这里写上/bin/bash 就行了 
#!/bin/bash
#这是注释
ls -al

一. 例子实战

下面要讲的内容其中包括一些Linux命令,不懂的可以参考我之前写的Linux命令的相关博客。

Shell编程非常的简单,每个shell脚本第一句都是  # !bin/sh  ;最后命令行下通过使用sh example运行脚本程序即可。

例子1:demo1.sh

#! /bin/sh
#this is to show what a example looks like.
echo "my first shell!"   #输出一句话
echo "this is current directory."
/bin/pwd                 #命令要都是绝对路径
echo                     #相当于空行
echo "this is files."
/bin/ls 

执行结果:

love@iZuf69ps3de0b3n4a50j7nZ:~/shelldir$ sh demo1.sh
my first shell!
this is current directory.
/home/love/shelldir

this is files.
demo1.sh  demo2.info  demo2.sh

例子2:demo2.sh

如果我们想使用shell脚本,指定个计划任务,比如每周的周一到周五给管理员发一个信息(比如当前主机的信息,如内存使用的情况,在线人数,磁盘空间等等)

#! /bin/sh
/bin/date +%F >> ./demo2.info     #把日期追加写入到文件demo.info文件中,没有这个文件会自动创建。
echo "disk info:" >> ./demo2.info
/bin/df -hl  >> ./demo2.info
echo  >> ./demo2.info
echo "online users:" >> ./demo2.info		#在线用户
/usr/bin/who | /bin/grep -v root >> ./demo2.info #该命令可以参考我之前的文档,过滤命令前一个输出,作为后一个输入,其中-v为排除root用户,
echo "memory info:" >> ./demo2.info
/usr/bin/free -m >> ./demo2.info
echo >> ./demo2.info    #类似换行符,不理解可以试验一下。
#write root
#/usr/bin/write root < ./demo2.info && /bin/rm/  ./demo2.info  #<写给,把后面那个文件demo2.info写给管理员,并且都成功的时候,把demo2.info删除
#crontab -e  为定时
#0 9 * * 1-5 /bin/sh  /home/love//home/love/shelldir/demo2.sh   #其中0为分钟,9为小时,*天数, *月数,1-5为周五,也就是每个周一到周五9点这一时
#刻执行shell脚本

其中为了理解下面这个命令,特别拿出来实验一下。

love@iZuf69ps3de0b3n4a50j7nZ:~$ date
Wed Jan 16 13:22:50 CST 2019
love@iZuf69ps3de0b3n4a50j7nZ:~$ date +%F
2019-01-16

其中+%F为linux中输出的时间日期格式。

执行结果:

love@iZuf69ps3de0b3n4a50j7nZ:~/shelldir$ ls
demo1.sh  demo2.sh
love@iZuf69ps3de0b3n4a50j7nZ:~/shelldir$ sh demo2.sh 
love@iZuf69ps3de0b3n4a50j7nZ:~/shelldir$ ls
demo1.sh  demo2.info  demo2.sh
love@iZuf69ps3de0b3n4a50j7nZ:~/shelldir$ cat demo2.info 
2019-01-16
disk info:
Filesystem      Size  Used Avail Use% Mounted on
udev            983M     0  983M   0% /dev
tmpfs           201M   18M  183M   9% /run
/dev/vda1        40G  9.1G   29G  25% /
tmpfs          1001M     0 1001M   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs          1001M     0 1001M   0% /sys/fs/cgroup
tmpfs           201M     0  201M   0% /run/user/1001

online users:
love     pts/0        2019-01-16 13:03 (117.173.217.52)
love     pts/1        2019-01-16 13:22 (117.173.217.52)
memory info:
              total        used        free      shared  buff/cache   available
Mem:           2000          97         132          17        1770        1689
Swap:             0           0           0

 

你可能感兴趣的:(Linux,Shell编程,Ubuntu,Linux,Ubuntu,Linux)