shell基础
1、认识shell
- Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
- Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
- shell是一种解释型语言,这种语言经过编写后不经过任何编译就可以执行,是一种脚本语言。和编译型语言是执行前翻译不同,解释型语言的程序是执行时翻译,所以效率要差一些。
- CentOS系统中支持很多shell,可以通过查看/etc/shells文件,查看所支持的shell,目前大多数的Linux基本都使用bash
[root@wei ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
- bash shell有两种工作模式:
- 互动模式 和 脚本模式。
- 脚本模式效率更高,可以实现自动化。
- 编写第一个shell脚本:
[root@sunday-test shell-script]# cat HelloWorld.sh
#!/bin/bash //是一个标记,告诉系统执行这个文件需要的解释器
# this line is a comment // “#”号开头的行代表注释
echo "Hello World"
- 运行脚本有两种方法:
1、使用bash命令执行
[root@sunday-test shell-script]# bash HelloWorld.sh
Hello World
# “.”号和source命令也都可以执行脚本,且不需要可执行权限
[root@sunday-test shell-script]# . HelloWorld.sh
Hello World
[root@sunday-test shell-script]# source HelloWorld.sh
Hello World
2、给脚本添加可执行权限,然后直接就可以执行了
[root@sunday-test shell-script]# chmod o+x HelloWorld.sh
[root@sunday-test shell-script]# ./HelloWorld.sh
Hello World
2、使用变量
变量
变量就是其值可以变化的量。从变量的本质来说,变量名是指向一片用于存储数据的内存空间。变量有局部变量、环境变量之分。在脚本中,往往需要使用变量来存储有用信息,比如文件名、路径名、数值等,通过这些变量可以控制脚本的运行行为。
1、局部变量: 是指在某个shell中生效的变量,对其他shell来说无效,局部变量的作用域被限定在声明它们的shell中,可以使用local内建命令来“显式”的声明局部变量,但仅限于函数内使用。
2、环境变量: 通常又称“全局变量”,以区别于局部变量。在shell脚本中,变量默认就是全局的,为了让子shell继承当前shell的变量,可以使用export命令将其定义为环境量。
- bash中默认包含有几十个预设的环境变量,下面介绍一些常用的:
# BASH: Bash shell的全路径。
[root@sunday-test ~]# echo $BASH
/bin/bash
# BASH_VERSION : bash shell的版本
[root@sunday-test ~]# echo $BASH_VERSION
4.2.46(1)-release
# EUID:记录当前用户的UID。
[root@sunday-test ~]# echo $EUID
0
# FUNCNAME:在用户函数体内部,记录当前函数体的函数名。
[root@sunday-test shell-script]# cat funcname.sh
#!/bin/bash
funcname() {
echo $FUNCNAME
}
funcname
[root@sunday-test shell-script]# source funcname.sh
funcname
# HISTCMD:记录下一条命令在history命令中的编号
# HISTFILE:记录history命令记录文件的位置
# HISTFILESIZE:设置HISTFILE文件记录命令的行数
# HISTSIZE:设置命令缓冲区的大小
# HOSTNAME:设置主机名
# HOSTTYPE:展示主机的架构
[root@sunday-test shell-script]# echo $HOSTTYPE
x86_64
# MACHTYPE:主机类型的GNU标识,这种标识有统一的结构。一般来说是“主机架构-公司-系统-gnu”
[root@sunday-test shell-script]# echo $MACHTYPE
x86_64-redhat-linux-gnu
# LANG:设置当前系统的语言环境。
[root@sunday-test shell-script]# echo $LANG
zh_CN.UTF-8
[root@sunday-test shell-script]# LANG=en_US.UTF-8
[root@sunday-test shell-script]# echo $LANG
en_US.UTF-8
# PWD:记录当前目录
# OLDPWD:记录之前目录
# PATH:代表命令的搜索路径,非常重要
变量命名
shell中的变量必须以字母或者下划线开头,后面可以跟数字、字母和下划线,长度没有限制,区分大小写。
- 正确的变量命名:
firstname
FIRSTNAME
_helloworld
big_data
Fullname
Person01
- 错误的变量命名:
51pally # 变量不能以数字开头
*badname # 变量不能以特殊字符开头
PS1 # 变量不能和shell的预设变量名重名
for # 变量不能使用shell的关键字
变量赋值和取值
定义变量:变量名=变量值
- 注意点1:变量名和变量值之间用等号紧紧相连,之间没有任何空格
[root@sunday-test ~]# name=john
[root@sunday-test ~]# name= john
bash: john: command not found...
- 注意点2:当变量值中有空格时必须用引号括起,否则会出现错误,可以是双引号,也可以 是单引号
[root@sunday-test ~]# name="li si"
[root@sunday-test ~]# name=li si
bash: si: command not found...
Similar command is: 'ci'
- 变量的取值很简单,在变量名前加{}。建议用后者
[root@sunday-test ~]# echo $name
li si
[root@sunday-test ~]# echo ${name}
li si
- 取消变量:取消变量使用unset,后面跟变量名。函数也是可以被取消的,unset后面也是可以跟上函数名来取消函数的。
[root@sunday-test ~]# unset name
- 从键盘输入内容为变量赋值
read [-p "提示信息"] 变量名
特殊变量
1、位置参数
# shell中还有一些预先定义的特殊只读变量,它们的值只有在脚本运行时才能确定。
$0:代表脚本本身名字
$1----$9:第一个位置参数-------第9个位置参数
$#:脚本参数的个数总和
$@:表示脚本的所有参数
$* :表示脚本的所有参数
[root@sunday-test shell-script]# cat posion.sh
#!/bin/bash
echo "这个脚本的名字是:$0"
echo "参数一共有$#"
echo "参数的列表是: $@"
echo "参数的列表是: $*"
echo "第一个参数是: $1"
echo "第二个参数是: $2"
echo "第三个参数是:$3"
[root@sunday-test shell-script]# ./posion.sh a b c
这个脚本的名字是:./posion.sh
参数一共有3
参数的列表是: a b c
参数的列表是: a b c
第一个参数是: a
第二个参数是: b
第三个参数是:c
2、脚本或者命令返回值:$?
# 正常退出的命令和脚本应该返回值为0,任何非0的返回值都表示命令未正确退出或未正常执行
[root@sunday-test ~]# ifcofj
bash: ifcofj: 未找到命令...
[root@sunday-test ~]# echo $?
127
[root@sunday-test ~]# ping -c 1 192.168.5.23
PING 192.168.5.23 (192.168.5.23) 56(84) bytes of data.
From 192.168.5.141 icmp_seq=1 Destination Host Unreachable
--- 192.168.5.23 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
[root@sunday-test ~]# echo $?
1