shell脚本了解
[toc]
shell版本
擅长处理纯文本类型的数据
弱类型语言
通用的标准 Bourne shell (sh)
和 C shell (csh)
,其中 Bourne shell (sh)
被 bash shell
取代
优势: 在于处理操作系统底层业务(大量的命令)
shell种类
- Bourne shell ( 包括 sh、ksh、bash )
Bourne shell (sh)
Korn shell (ksh)
Bourne Again shell (bash)
POSIX shell (sh)
- C shell ( 包括 sch 、 tcsh)
C shell (csh)
TENEX/TOPS C shell (tcsh)
常见操作系统的默认shell
-
linux
是Bourne Again shell (bash)
-
Solaris
和FreeBSD
是Bourne shell (sh)
-
AIX
(IBM的Unix) 是Korn shell (ksh)
-
HP-Unix
( 惠普的Unix) 是POSIX shell (sh)
查看linux系统默认的shell:
方法一:
root@ubuntu:~# echo $SHELL
/bin/bash
方法二:
root@ubuntu:~# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:117:125:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
shell脚本的建立和执行
使用编辑器 vi/vim
编辑器
脚本开头
#!/bin/bash 标准写法
或
#!/bin/sh
#! 称为 幻数,在执行 bash 脚本时,内核会确定用什么解释脚本的内容,必须在脚本的第一行,否则会被解释为 注释
Linux中常见脚本开头的编码语法:
#!/bin/sh
#!/bin/bash
#!/bin/sed # sed 脚本
#!/usr/bin/awk # awk 语言
#!/usr/bin/env python # python 语言
#!/usr/bin/expect
#!/usr/bin/perl
#!/usr/bin/tel
若脚本开头不指定解释器,则需要对应的解释器来执行脚本
脚本注释
shell脚本 中 井号(#) 后面的内容都是注释的内容
bash 与 dash
Debian和Ubuntu中,/bin/sh默认已经指向dash,是一个不同于bash的shell,它主要是为了执行脚本而出现,而不是交互,它速度更快,但功能相比bash要少很多,语法严格遵守POSIX标准
root@ubuntu:~# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 11月 12 2019 /bin/sh -> dash
root@ubuntu:~# ll /bin/sh
lrwxrwxrwx 1 root root 4 11月 12 2019 /bin/sh -> dash*
dash解释器可能会使得一些bash语法写的shell 脚本不能运行
切换默认的 /bin/sh 指向 bash
root@ubuntu:~# sudo dpkg-reconfigure dash
弹出界面修改,询问你是否使用dash作为默认的 /bin/sh
修改的话就选择: 否
修改之后查看
root@ubuntu:~# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 7月 25 11:04 /bin/sh -> bash
脚本的执行
shell 脚本是 以 非交互的方式运行时,先查找环境变量( ENV ),该变量指定了一个环境文件( .bashrc) ,然后改环境变量文件开始执行,读取env文件后,开始执行shell脚本内容
linux 环境下的 /etc/profile
存放至全局的环境变量文件
若文件定义的变量放在etc/profile.d/
目录中,会默认为环境变量
查看用户的环境变量:
ll /home/yz-0127/ -al
shell脚本的执行通常可以采用的方式:
-
bash 脚本全路径
或sh 脚本全路径
当脚本文件本身没有可执行权限,或者文件开头没有指定解释器
yz-0127@ubuntu:~$ bash /mysh/demo.sh
hello World!
- 脚本全路径
yz-0127@ubuntu:~$ /mysh/demo.sh
hello World!
-
source 脚本全路径
或. 脚本全路径
yz-0127@ubuntu:~$ source /mysh/demo.sh
hello World!
注意:利用tab补全路径,当不能补全时,说明没有文件的权限
反引号( ` ` ) 会解释 一些命令
source和.与其他方式的区别
source
和 .
相当于 PHP
中的 include
,引入其他脚本的文件
root@ubuntu:~# cat 5.sh
#!/bin/bash
user=`whoami`
root@ubuntu:~# bash 5.sh
root@ubuntu:~# echo $user
root@ubuntu:~# source 5.sh
root@ubuntu:~# echo $user
root
root@ubuntu:~#
基本规范
- 开头指定脚本解释器
#!/bin/bash
- 开头加上版本版权等信息
# Date :更新时间
# Author : 作者
# Mail: 邮箱
# Function : 脚本功能
# Version : 版本
可以配置vim编辑文件时自动加上信息,方法时 修改 /.vimrc 配置文件
- 脚本中尽量不要用中文,注释也用英文标识
linux对中文支持不好
- 扩展名
.sh
- 中括号[] 两端要有空格
[ yz ]
- 流程控制语句 一次性完成轮廓,然后再书写具体内容
- 通过缩进使代码更易读
变量基础及深入
分类:
- 环境变量(全局变量)
- 局部变量
局部变量只能在创建他们的shell函数或脚本中使用
环境变量也称全局变量,可以在创建他们的shell函数 及其 派生出来的任意子进程shell中使用
存在着一些专用的shell变量
环境变量
环境变量可以在命令行中设置,但档用户退出时,这些变量值就会丢失,因此最好在用户 /home
目录下 的 .bash_profile
文件中或 全局配置 /etc/bash.bashrc
/etc/profile
文件 或 /etc/profile.d/
中定义
系统在加载过程中,会把先把全部的全局变量加载
将环境变量方如 profile 文件中,每次用户登录时这些变量都会被初始化
- 所有的环境变量大写
- 环境变量用于用户进程前,必须使用export内置命令导出的变量
例如:
root@ubuntu:~# echo $HOME
/root
root@ubuntu:~# echo $USER
root
root@ubuntu:~# echo $uid
root@ubuntu:~# echo $UID
root@ubuntu:~# echo $UID
0
root@ubuntu:~# echo $SHELL
/bin/bash
设置环境变量
在给变量赋值之后或设置变量时使用 export
命令
或者 带 -x
选项的 declare
内置命令
注意 : 输出变量时候不能再变量名前加 $
格式:
(1) export 变量名 = value
(2) 变量名 = value : export 变量名
(3) declare -x 变量名 = value
自定义环境变量,在生产环境中需要一些配置文件,例如 java环境配置实例
一般的配置环境变量放在 /etc/profile`
取消环境变量
显示默认的环境变量:
root@ubuntu:~# env
root@ubuntu:~# printenv
root@ubuntu:~# set
用 unset
取消 本地变量和环境变量
root@ubuntu:~# echo $USER
root
root@ubuntu:~# unset USER
root@ubuntu:~# echo $USER
root@ubuntu:~#
unset 取消变量,退出用户,再次登录还是会存在,想要彻底取消,需要书写的配置文件中
局部变量(本地变量)
本地变量在用户当前的shell生存期的脚本中使用
当在shell中启动另一个进程或退出,本地变量就会失效
定义方法:
变量名 = value
用于:直接定义变量的内容,内容一般为简单连续的数字、字符串、路径名等
a = 33
b = yes
变量名 = 'value'
单引号定义变量 , 内容中是什么就会输出什么,变量不会被解析
用于:定义显示纯字符串
a = 'WRONG'
变量名 = "value"
双引号定义变量
用于:字符串中附带有变量的内容的定义
a = "this is wrong"
例如:
root@ubuntu:~# a=192.168.1.2
root@ubuntu:~# b='193.168.1.2'
root@ubuntu:~# c="194.168.1.2"
root@ubuntu:~# echo "a=$a"
a=192.168.1.2
root@ubuntu:~# echo "b=$b"
b=193.168.1.2
root@ubuntu:~# echo "c=${c}"
c=194.168.1.2
root@ubuntu:~#
单引号'' 不会解析其内容
root@ubuntu:~# echo 'a=$a'
a=$a
命名规范:
- 变量命名要统一,使用大写字母
- 予以要清晰,能够表达变量内容的含义
- 过长的单词使用 单词前几个字母 代替
- 多个单词连接使用 "_" 连接
- 避免无含义的字符或数字
- 使用变量时,采用大括号,会比较清晰
- 字符串变量通常用双引号括起来,减少怪异的错误
局部变量规范:
使用local定义变量,代表只在脚本中的函数体生效
local a;
把命令定义为变量
- 利用 反引号( `` ) ,定义变量
root@ubuntu:~# time=`date +%F`
root@ubuntu:~# echo $time
2020-07-29
- 利用小括号,定义变量 (常用)
root@ubuntu:~# time=$(date +%F)
root@ubuntu:~# echo $time
2020-07-29