为了实现自动化运维,对服务器实现自动化控制,我们需要学习shell脚本编程。
内核是操作系统的核心,它负责管理内存、调度任务和驱动硬件等基本功能。内核的外面一层叫做shell(外壳),shell可以保护内核免受伤害。shell的外面就是各种各样的应用程序。应用程序在执行的时候通过shell翻译成内核可以理解的某一种语言。可见shell是非常重要的 。
每一种操作系统都有自己的shell,如DOS:command.com;windows:explorer.exe。Linux有多种shell。
[root@node1 ~]# chsh -l (或# cat /etc/shells) /bin/sh /bin/bash /sbin/nologin /bin/dash
/bin/sh(一个叫波恩的人开发的)最早出现的shell, /bin/csh用于BSD, /bin/bash,/bin/tcsh, /bin/ksh。centos中标准的shell是/bin/bash
查看系统当前使用的shell:
[root@node1 ~]# echo $SHELL /bin/bash
shell之间的切换:
# history
# !21 (执行第21条命令)
记录历史命令的条数由两个环境变量决定:HISTFILESIZE=1000,HISTSIZE=1000(当前的shell最多记录1000行)
# set 或 env(显示系统环境变量)
3. Tab键命令补齐功能(1次tab和2次tab)
4. 前台和后台功能
# cp -a /usr/share/* /root/tmp/abc/ (在前台执行一个耗时的任务,此时再输入别的命令没有反应)
ctrl + z 暂停运行
# jobs (查看正在运行或暂停的任务)
# fg 编号(把暂停的任务调入前台运行)
# bg 编号(调入后台运行)
# cp -a /usr/share/* /root/tmp/abc/ & (后台运行)
5. 输入输出重定向
# mail user10 (若mail客户端没安装,yum -y install mailx,其配置文件/etc/mail.rc)
Subject: ok
hello,i am admin.
. (输入点号结束)
邮件内容是通过标准输入设备键盘输入的。其实邮件内容也可以保存在一个文件中,然后使用输入重定向符(<)从文件中提取输入内容,加上计划任务就可以自动发邮件了。
# mail -s ok user10 < f1 (邮件内容来自文件f1)
查看邮件是否发送出去:# tail -f /var/log/maillog
输出重定向可以使用 >(覆盖)或 >>(追加)
标准输入
标准输出(指的是正确信息)
标准错误(指的是错误信息)
# su - user10
$ find / -size +10M(出现了很多 find: `/var/lib/postfix‘: Permission denied的错误信息)
[root@node1 ~]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 Sep 7 07:11 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Sep 7 07:11 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Sep 7 07:11 /dev/stdout -> /proc/self/fd/1
0 表示stdin标准输入,1 表示stdout标准输出,2 表示stderr标准错误
$ find / -size +10M 1>/dev/null(1代表标准输出,/dev/null 表示空设备文件,即把正确信息重定向到/dev/null,屏幕上显示的全是错误信息)
$ find / -size +10M 2>/dev/null(2代表标准错误,屏幕上显示的全是正确信息)
$ find / -size +10M &>/dev/null(&表示1和2,正常和错误信息都不显示)
$ find / -size +10M >/dev/null 2>&1(2>&1 的意思是将标准错误重定向到标准输出,这里标准输出已经重定向到了/dev/null,那么标准错误也会输出到/dev/null。为什么是&1而不是1?&符号可以理解为引用(reference),&1就是对标准输出的引用,只打开一次文件。)
例子:搜索系统中有没有user10这个账号
# grep ‘^user10\>‘ /etc/passwd &>/dev/null && echo "ok" || echo "not"
6. 通配符
? 任意1个字符
* 任意字符或字符串
[ ] 任意一个栏位
# ll f[a-z]
# ll f[0-9]
# ll f[!0-9]
7. 变量
分为本地变量,环境变量,位置变量,状态变量
7.1 本地变量:只能在当前shell中使用的变量
# ABC=10
# set | less(可以查看到这个变量)
# echo $ABC(显示变量的值)
# /bin/bash(进入到另一个shell)
# echo $ABC(没有值,本地变量只能在当前shell使用)
7.2 环境变量
# export ABC(将该变量变为环境变量,unset ABC为相反操作)
# /bin/bash
# echo $ABC(有值)
# env(显示所有的环境变量)
# set(显示所有的变量,环境变量+本地变量)
系统环境变量的解读,例如颜色的设置等(省略...)
环境变量是靠环境文件产生的(①首先执行,④最后执行)
系统环境文件:① /etc/profile, ④ /etc/bashrc
个人: ② ~/.bash_profile,③ ~/.bashrc
解读/etc/profile文件:(-z表示为null,变量未定义;-x表示可执行;-f表示是否存在某个文件;-a表示and)
1 if [ -x /usr/bin/id ]; then 2 if [ -z "$EUID" ]; then 3 # ksh workaround 4 EUID=`/usr/bin/id -u` 5 UID=`/usr/bin/id -ru` 6 fi 7 USER="`/usr/bin/id -un`" 8 LOGNAME=$USER 9 MAIL="/var/spool/mail/$USER" 10 fi
7.3 状态变量:上一次指令执行的结果,0为真(正确),非0为假(错误)。
# echo $?(?为状态变量)
7.4 位置变量
$1(第一个变量) $2(第二个变量) $0(表示脚本的基名basename)
#!/bin/bash let SUM=$[$1 + $2] echo $1 $2 $SUM $0
8. 引号
双引号 " " — 变量的弱引用(得到变量的值)
单引号 ‘ ‘ — 变量的强引用(用得较少)
反引号 ` ` — 命令的取代
原文:https://www.cnblogs.com/ybliu/p/11506281.html