shell脚本
编程语言介绍
编程语言是指计算机能理解的语言,人类通过使用计算机语言可以给计算机批量下达任务,让其按照人类的思想去完成工作。
最常见的语言有:汇编语言、C语言、java语言、php语言、Python语言、golang语言等等。
编程语言分类:
编译型语言 程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++、java、Golang等
解释型语言 程序不需要编译,程序在运行时由解释器翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/JavaScript/ Perl /ruby/Shell等都是解释型语言。
shell介绍
是一个程序,采用C语言编写,它既是一种命令语言,又是一种解释性的编程语言。
用途:
重点:重复性的工作,全部通过脚本来完成。高效的同时还不出错。
秘诀
学习脚本的秘诀: 多看(看懂)——>多模仿(多练)——>多思考
Bash shell
命令和文件自动补全
Tab只能补全命令和文件
常见的快捷键—提升操作熟练度
Ctrl+c 终止前台运行的程序 Ctrl+z 将前台运行的程序挂起到后台 Ctrl+d 退出 等价exit Ctrl+l 清屏 Ctrl+a |home 光标移到命令行的最前端 Ctrl+e |end 光标移到命令行的后端 Ctrl+u 删除光标前所有字符 Ctrl+k 删除光标后所有字符 Ctrl+r 搜索历史命令
shell脚本语法
脚本命名
脚本的扩展名为.sh
名字不要太长,在26个字节内
脚本代码
#!/bin/bash
在脚本的第一行
#! 为魔法字符,指定脚本代码执行的程序,告诉系统使用哪一种shell
//以下内容是对脚本的基本信息的描述,大家可以根据实际情况尽可能的写详细一些,方便后续使用者 # Name: 脚本名字 # Desc:描述describe # Path:存放路径 # Usage:用法 # Update:更新时间 # Author:作者 # Release: 分发版本
命令式脚本执行方法:
定义命令路径变量 PATH PATH=$PATH:脚本路径备注:脚本必须给执行权限
变量
定义
变量就是一个可以变得值
变量的格式为:变量名=值
shell中定义变量时,=的前后不能出现空格,否则会报错
变量的举例
var=1 age=18 整形变量 name='zuojie' 字符串变量 score=88.8 浮点型变量
输出变量echo
在文本中输入 echo 变量名
name="hujinwen" echo $name hujinwen
取消变量unset
使用 unset 变量名 即可取消掉变量名
name=huujinwen unset name echo $name 这里显示的是空白
有类型变量 declare
使用declare -i 即可将变量看成是一个整数
declare -i name='hujinwen' echo $name 0
使用declare -r 即可将一个变量变为只读状态
注意:非必要不要设置只读,只读变量通常为不可变变量
declare -r name
变量的分类
本地变量
通常为用户自己设置的变量,一般在脚本执行一次,或者终端结束后就会消失
基本上就是我们在当前的终端输入的变量
环境变量
通常这种变量基本都存放在 /etc/profile 中
查看当前用户的环境变量 env
查询当前用户的所有变量(临时变量与环境变量) set
export 将一个自己设置的变量变为环境变量
定义一个临时变量
export name=hujinwen 查看自己设置的环境变量 env | grep ^ name name=hujinwen
定义一个永久生效的变量
需要进入配置文件中去添加变量
vim /etc/profile 或者 ~/.bashrc
全局变量
使用export命令将本地变量输出为当前shell中的环境变量 所有用户及shell都可以使用,可以在/etc/profile /etc/bashrc下永久定义
内置变量
系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用
变量取值
echo $变量名
即可读取变量
注意:
变量读取过程中,默认单引号是不解释变量的.比如 [root@zuolaoshi ~]# echo '$name' $name 如果必须使用单引号还要读取变量的值可以使用eval命令[重新运算求出参数的内容] [root@zuolaoshi ~]# eval echo '$name' zj
其他变量
1.目录或者文件提取变量
name=/etc/yum.repos.d/yum.repo
取出目录 dirname $name 结果:/etc/yum.repos.d 取出文件 basename $name 结果:yum.repo
2.变量内容中的删除和替换
一个“%”代表从右往左去掉一个/key/
两个“%%”代表从右往左最大去掉/key/
一个“#”代表从左往右去掉一个/key/
两个“##”代表从左往右最大去掉/key/
shell格式化输出
echo
转义字符
\a 发出警告声;
\b 删除前一个字符;
\t 插入tab;
\n 换行且光标移至行首;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\r 光标移至行首,但不换行;
\v 与\f相同;
\ 插入\字符;
\0nnn 打印nnn(八进制)所代表的ASCII字符; 备注:数字0 不要理解成字母o
\xNN 打印NN(十六进制)所代表的ASCII字符;
输出颜色字体
脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e
其中41的位置代表底色, 36m的位置是代表字的颜色
1、字背景颜色和文字颜色之间是英文的
2、文字颜色后面有个m
3、字符串前后可以没有空格,如果有的话,输出也是同样有空格
下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配 例 echo -e “\033[31m 红色字 \033[0m” echo -e “\033[34m 黄色字 \033[0m” echo -e “\033[41;33m 红底黄字 \033[0m” echo -e “\033[41;37m 红底白字 \033[0m” 字颜色:30—–37 echo -e “\033[30m 黑色字 \033[0m” echo -e “\033[31m 红色字 \033[0m” echo -e “\033[32m 绿色字 \033[0m” echo -e “\033[33m 黄色字 \033[0m” echo -e “\033[34m 蓝色字 \033[0m” echo -e “\033[35m 紫色字 \033[0m” echo -e “\033[36m 天蓝字 \033[0m” echo -e “\033[37m 白色字 \033[0m” 字背景颜色范围:40—–47 echo -e “\033[40;37m 黑底白字 \033[0m” echo -e “\033[41;37m 红底白字 \033[0m” echo -e “\033[42;37m 绿底白字 \033[0m” echo -e “\033[43;37m 黄底白字 \033[0m” echo -e “\033[44;37m 蓝底白字 \033[0m” echo -e “\033[45;37m 紫底白字 \033[0m” echo -e “\033[46;37m 天蓝底白字 \033[0m” echo -e “\033[47;30m 白底黑字 \033[0m” 最后面控制选项说明 \033[0m 关闭所有属性 \033[1m 设置高亮度 \033[4m 下划线 \033[5m 闪烁 \033[7m 反显 \033[8m 消隐 \033[30m — \33[37m 设置前景色 \033[40m — \33[47m 设置背景色 \033[nA 光标上移n行 \033[nB 光标下移n行 \033[nC 光标右移n行 \033[nD 光标左移n行 \033[y;xH设置光标位置 \033[2J 清屏 \033[K 清除从光标到行尾的内容 \33[s 保存光标位置 \033[u 恢复光标位置 \033[?25l 隐藏光标 \033[?25h 显示光标
shell解释器
java 需要虚拟机解释器, 同理 shell 脚本也需要解析器,如下所示:
[root@node01 shells] cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh
执行shell脚本
执行方式一
/bin/sh 01.sh hello world或
/bin/bash 01.sh hello world
bash和sh是什么关系:sh是bash的快捷方式
执行方式二
方式一的简化方式:
[root@node01 shells] bash hello.sh hello world [root@node01 shells] sh hello.sh hello world
执行方式三
./文件名 [root@node01 shells] ./hello.sh -bash: ./01.sh: 权限不够如果权限不足,则需要使用chmod去给文件执行的权限