Linux shell基础

一.Shell概述

1.Shell是什么

  • Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

shell

  • Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

2.Shell的分类

  • Bourne Shell:从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。
  • C Shell: C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名。
  • Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh
  • Bash: Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。

3.Linux支持的Shell

/etc/shells

二.Shell脚本的执行方式

1.echo输出命令

[root@localhost ~]# echo [选项] [输出内容]

选项:

-e: 支持反斜线控制的字符转换

控制字符作 用
\输出本身
a输出警告音
b退格键,也就是向左删除键
c取消输出行末的换行符。和“-n”选项一致取消输出行末的换行符。和“-n”选项一致
eESCAPE键
f换页符
n换行符
r回车键
t制表符,也就是Tab键
v垂直制表符
0nnn按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
xhh按照十六进制ASCII码表输出字符。其中hh是两位十六进制数

[root@localhost ~]# echo -e "abbc"

#删除左侧字符

[root@localhost ~]# echo -e "atbtcndtetf"

#制表符与换行符

[root@localhost ~]# echo -e "x61tx62tx63nx64tx65tx66"

#按照十六进制ASCII码也同样可以输出

[root@localhost ~]# echo -e "e[1;31m abcd e[0m"

#输出颜色

#30m=黑色,31m=红色,32m=绿色,33m=黄色

#34m=蓝色,35m=洋红,36m=青色,37m=白色

2.第一个脚本

[root@localhost sh]# vi hello.sh

#!/bin/Bash

# Author: stepsix

# site: stepsix.cn

echo -e "Welcome to my blog: stepsix.cn!"

3.脚本执行

  • 赋予执行权限,直接运行

chmod 755 hello.sh

./hello.sh

  • 通过Bash调用执行脚本

bash hello.sh

三. Bash的基本功能

1.历史命令与命令补全

(1)历史命令

[root@localhost ~]# history [选项] [历史命令保存文件]

选项:

-c: 清空历史命令

-w: 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history

历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改

历史命令的调用:

  • 使用上、下箭头调用以前的历史命令
  • 使用“!n”重复执行第n条历史命令
  • 使用“!!”重复执行上一条命令
  • 使用“!字串”重复执行最后一条以该字串开头的命令

(2)命令与文件补全

在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全

2.命令别名与常用快捷键

(1)命令别名

[root@localhost ~]# alias 别名='原命令'

#设定命令别名

[root@localhost ~]# alias

#查询命令别名

命令执行时顺序:

  1. 第一顺位执行用绝对路径或相对路径执行的命令。
  2. 第二顺位执行别名。
  3. 第三顺位执行Bash的内部命令。
  4. 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。

让别名永久生效

[root@localhost ~]# vi /root/.bashrc

删除别名

[root@localhost ~]# unalias 别名

(2)Bash常用快捷键

快捷键作用
ctrl+A把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。
ctrl+E把光标移动到命令行结尾。
ctrl+C强制终止当前的命令。
ctrl+L清屏,相当于clear命令。
ctrl+U删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便
ctrl+K删除或剪切光标之后的内容。
ctrl+Y粘贴ctrl+U或ctrl+K剪切的内容。
ctrl+R在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。
ctrl+D退出当前终端。
ctrl+Z暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管理章节详细介绍。
ctrl+S暂停屏幕输出。
ctrl+Q恢复屏幕输出。

3.输入输出重定向

(1)标准输入输出

设备设备文件名文件描述符类型
键盘/dev/stdin0标准输入
显示器/dev/sdtout1标准输出
显示器/dev/sdterr2标准错误输出

(2)输出重定向

类型符号作用
标准输出重定向命令 > 文件以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。
命令 >> 文件以追加的方式,把命令的正确输出输出到指定的文件或设备当中。
标准错误输出重定向错误命令 2>文件以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中。
错误命令 2>>文件以追加的方式,把命令的错误输出输出到指定的文件或设备当中。
命令 > 文件 2>&1以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。
命令 >> 文件 2>&1以追加的方式,把正确输出和错误输出都保存到同一个文件当中。
正确输出和错误输出同时保存命令 &>文件以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。
命令 &>>文件以追加的方式,把正确输出和错误输出都保存到同一个文件当中。
命令>>文件1 2>>文件2把正确的输出追加到文件1中,把错误的输出追加到文件2中。

(3)输入重定向

[root@localhost ~]# wc [选项] [文件名]

选项:

-c 统计字节数

-w 统计单词数

-l 统计行数

命令<文件 把文件作为命令的输入

命令<< 标识符

标识符

把标识符之间内容作为命令的输入

4.多命令顺序执行与管道符

(1)多命令顺序执行

多命令执行符格式作用
命令1 ;命令2多个命令顺序执行,命令之间没有任何逻辑联系
&&命令1 && 命令2逻辑与;当命令1正确执行,则命令2才会执行,当命令1执行不正确,则命令2不会执行。
\\ 命令1\\命令2逻辑或;当命令执行不正确,则命令2才会执行,当命令1正确执行,则命令2不会执行。

例子:

[root@localhost ~]# ls ; date ; cd /user ; pwd

[root@localhost ~]# dd if=输入文件 of=输出文件 bs=字节数 count=个数

选项:

if=输入文件 指定源文件或源设备

of=输出文件 指定目标文件或目标设备

bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块

count=个数 指定输入/输出多少个数据块

例子:

[root@localhost ~]# date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date

[root@localhost ~]# ls anaconda-ks.cfg && echo yes

[root@localhost ~]# ls /root/test || echo "no

[root@localhost ~]# 命令 && echo yes || echo no

(2)管道符

命令格式:

[root@localhost ~]# 命令1 | 命令2

#命令1的正确输出作为命令2的操作对象

颜色显示

例子:

[root@localhost ~]# ll -a /etc/ | more

[root@localhost ~]# netstat -an | grep "ESTABLISHED"

[root@localhost ~]# grep [选项] "搜索内容"

文件名

选项:

-i: 忽略大小写

-n: 输出行号

-v: 反向查找

--color=auto 搜索出的关键字用颜色显示

5.通配符与其他特殊符号

(1)通配符

通配符作用
?匹配一个任意字符
*匹配0个或任意多个任意字符,也就是可以匹配任何内容
[]匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c。
[-]匹配中括号中任意一个字符,-代表一个范围。例如:[a-z]代表匹配一个小写字母。
[^]逻辑非,表示匹配不是中括号内的一个字符。例如:1代表匹配一个不是数字的字符。

[root@localhost ~]# cd /tmp/

[root@localhost tmp]# rm -rf *

[root@localhost tmp]# touch abc

[root@localhost tmp]# touch abcd

[root@localhost tmp]# touch 012

[root@localhost tmp]# touch 0abc

[root@localhost tmp]# ls ?abc

[root@localhost tmp]# ls [0-9]*

[root@localhost tmp]# ls 1*

(2)Bash中其他特殊符号

符号作用
''单引号。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义。
""双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。
``反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。
$()和反引号作用一样,用来引用系统命令。
#在Shell脚本中,#开头的行代表注释。
$用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。
\转义符,跟在之后的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不当做是变量引用。

反引号与$()

[root@localhost ~]# echo ls

[root@localhost ~]# echo $(date)

单引号与双引号

[root@localhost ~]# name=sc

[root@localhost ~]# echo '$name'

[root@localhost ~]# echo "$name"

[root@localhost ~]# echo ‘$(date)'

[root@localhost ~]# echo “$(date)"

四.Bash的变量

1.用户自定义变量

(1)什么是变量

变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。

(2)变量设置规则

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。
  • 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
  • 变量用等号连接值,等号左右两侧不能有空格。
  • 变量的值如果有空格,需要使用单引号或双引号包括。
  • 在变量的值中,可以使用“”转义符。
  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
  • 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
  • 环境变量名建议大写,便于区分。

(3)变量分类

  • 用户自定义变量
  • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
  • 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
  • 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

(4)本地变量

  • 变量定义

[root@localhost ~]# name="shen chao"

  • 变量叠加

[root@localhost ~]# aa=123

[root@localhost ~]# aa="$aa"456

[root@localhost ~]# aa=${aa}789

  • 变量调用

[root@localhost ~]# echo $name

  • 变量查看

[root@localhost ~]# set

  • 变量删除

[root@localhost ~]# unset name

2.环境变量

(1)环境变量是什么

用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。

(2)设置环境变量

export 变量名=变量值

#申明变量

env

#查询变量

unset 变量名

#删除变量

(3)系统常见环境变量

  • PATH:系统查找命令的路径

[root@localhost ~]# echo $PATH

/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin: /sbin:/bin:/usr/sbin:/usr/bin:/root/bin

  • PATH="$PATH":/root/sh

#PATH变量叠加

  • PS1:定义系统提示符的变量

d:显示日期,格式为“星期 月 日”

h:显示简写主机名。如默认主机名“localhost”

t:显示24小时制时间,格式为“HH:MM:SS”

T:显示12小时制时间,格式为“HH:MM:SS”

A:显示24小时制时间,格式为“HH:MM”

u:显示当前用户名

w:显示当前所在目录的完整名称

W:显示当前所在目录的最后一个目录

#:执行的第几个命令

$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”

举例:

  • [root@localhost ~]# PS1='[u@t w]$ '
  • [root@04:50:08 /usr/local/src]#PS1='[u@@ h # W]$‘
  • [root@04:53 上午 localhost 31 src]#PS1='[u@h W]$ '

3.位置参数变量

(1)位置参数变量

位置参数变量作用
$nn为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}.
$*这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#这个变量代表命令行中所有参数的个数

例子1:

#!/bin/bash
num1=$1
num2=$2
sum=$(( $num1 + $num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值

例子2:

#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The parameters is: $*"
#使用$*代表所有的参数
echo "The parameters is: $@"
#使用$@也代表所有参数

例子3:$*与$@的区别

#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
    do
        echo "The parameters is: $i"
    done
x=1
for y in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
    do
        echo "The parameter$x is: $y"
        x=$(( $x +1 ))
    done

4.预定义变量

(1)预定义变量

预定义变量作用
$?最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
$$当前进程的进程号(PID)
$!后台运行的最后一个进程的进程号(PID)
#!/bin/bash
# Author: stepsix (stepsix.cn)

echo "The current process is $$"
#输出当前进程的PID。 #这个PID就是variable.sh这个脚本执行时,生成的进程的PID

find /root -name hello.sh &
#使用find命令在root目录下查找hello.sh文件
#符号&的意思是把命令放入后台执行,工作管理我们在系统管理章节会详细介绍
echo "The last one Daemon process is $!"

(2)接收键盘输入

[root@localhost ~]# read [选项] [变量名]

选项:

-p “提示信息”:在等待read输入时,输出提示信息

-t 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间

-n 字符数: read命令只接受指定的字符数,就会执行

-s: 隐藏输入的数据,适用于机密信息的输入

#!/bin/bash
# Author: stepsix (stepsix.cn)

read -t 30 -p "Please input your name: " name
#提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中
echo "Name is $name "

read -s -t 30 -p "Please enter your age: " age
#年龄是隐私,所以我们用“-s”选项隐藏输入
echo -e "\n"
echo "Age is $age "

read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
#使用“-n 1”选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\n"
echo "Sex is $gender"

五.Bash的运算符

1. 数值运算与运算符

(1)declare声明变量类型

[root@localhost ~]# declare +/- 变量名

选项:

-: 给变量设定类型属性

+: 取消变量的类型属性

-i: 将变量声明为整数型(integer)

-x: 将变量声明为环境变量

-p: 显示指定变量的被声明的类型

(2)数值运算—方法1

[root@localhost ~]# aa=11

[root@localhost ~]# bb=22

#给变量aabb赋值

[root@localhost ~]# declare -i cc=$aa+$bb

(3)expr或let数值运算工具

[root@localhost ~]# aa=11

[root@localhost ~]# bb=22

#给变量aa和变量bb赋值

[root@localhost ~]# dd=$(expr $aa + $bb)

#dd的值是aabb的和。注意“+”号左右两侧必须有空格

(4)“$((运算式))”或“$[运算式]”

[root@localhost ~]# aa=11

[root@localhost ~]# bb=22

[root@localhost ~]# ff=$(( $aa+$bb ))

[root@localhost ~]# gg=$[ $aa+$bb ]

(5)运算符

优先级运算符说明
13-, +单目负、单目正
12!, ~逻辑非、按位取反或补码
11* , / , %乘、除、取模
10+, -加、减
9<< , >>按位左移、按位右移
8< =, > =, < , >小于或等于、大于或等于、小于、大于
7== , !=等于、不等于
6&按位与
5^按位异或
4\ 按位或
3&&逻辑与
2\\ 逻辑或
1=,+=,-,=,*=,/=,%=,&=, ^=,=, <<=, >>=赋值、运算且赋值

[root@localhost ~]# aa=$(( (11+3)*3/2 ))

#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级

[root@localhost ~]# bb=$(( 14%3 ))

#14不能3整除,余数是2

[root@localhost ~]# cc=$(( 1 && 0 ))

#逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0

2.变量测试与内容替换

变量置换方式变量y没有设置变量y为空值变量y设置值
x=${y-新值}x=新值x为空x=$y
x=${y:-新值}x=新值x=新值x=$y
x=${y+新值}x为空x=新值x=新值
x=${y:+新值}x为空x为空x=新值
x=${y=新值}x=新值 y=新值x为空 y值不变x=$y y值不变
x=${y:=新值}x=新值 y=新值x=新值 y=新值x=$y y值不变
x=${y?新值}新值输出到标准错误输出(就是屏幕)x为空x=$y
x=${y:?新值}新值输出到标准错误输出新值输出到标准错误输出x=$y

例子1:测试x=${y-新值}

[root@localhost ~]# unset y

#删除变量y

[root@localhost ~]# x=${y-new}

#进行测试

[root@localhost ~]# echo $x

new

#因为变量y不存在,所以x=new

[root@localhost ~]# y=""

#给变量y赋值为空

[root@localhost ~]# x=${y-new}

#进行测试

[root@localhost ~]# echo $x

[root@localhost ~]# y=old

#给变量y赋值

[root@localhost ~]# x=${y-new}

#进行测试

[root@localhost ~]# echo $x

old

六.环境变量配置文件

1.环境变量配置文件简介

(1)source命令

[root@localhost ~]# source 配置文件

[root@localhost ~]# . 配置文件

(2)环境变量配置文件简介

环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。

  • /etc/profile
  • /etc/profile.d/*.sh
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc

2.环境变量配置文件作用

  • /etc/profile
  • /etc/profile.d/*.sh
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc

读取顺序

/etc/profile的作用:

  • USER变量:
  • LOGNAME变量:
  • MAIL变量:
  • PATH变量:
  • HOSTNAME变量:
  • HISTSIZE变量:
  • umask:
  • 调用/etc/profile.d/*.sh文件

~/.bash_profile的作用

  • 调用了~/.bashrc文件。
  • 在PATH变量后面加入了“:$HOME/bin”这个目录

~/.bashrc的作用

  • 定义默认别名
  • 调用/etc/bashrc

/etc/bashrc的作用

  • PS1变量
  • umask
  • PATH变量
  • 调用/etc/profile.d/*.sh文件

3.其他配置文件和登录信息

(1)注销时生效的环境变量配置文件

~/.bash_logout

(2)其他配置文件

~/bash_history

(3)Shell登录信息

本地终端欢迎信息: /etc/issue

转义符作用
d显示当前系统日期
s显示当前系统日期
l显示登录的终端号,这个比较常用。
m显示硬件体系结构,如i386、i686等
n显示主机名
o显示域名
r显示内核版本
t显示当前系统时间
u显示当前登录用户的序列号

远程终端欢迎信息: /etc/issue.net

  • 转义符在/etc/issue.net文件中不能使用
  • 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务)

登陆后欢迎信息:/etc/motd

  • 不管是本地登录,还是远程登录,都可以显示此欢迎信息

  1. 0-9
最后修改:2020 年 02 月 18 日 08 : 59 PM
如果觉得我的文章对你有用,请随意赞赏