一. shell介绍
一. 例子实战
例子1:demo1.sh
例子2:demo2.sh
1. shell属于弱类型编程语言,其中:
2. 变量赋值,引用
# 显式地直接赋值(可以重复为变量赋值):
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. 变量类型:(局部变量(常用)、环境变量)
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运行脚本程序即可。
#! /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
如果我们想使用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