shell基础

1、认识shell

  • Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
  • 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