Linux学习之Shell基础


一、Shell概述
1.Shell概述:
Shell:壳,Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便

运行程序的界面级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。类似

于翻译,相当于windows的操作界面
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(标准Shell)、psh、zsh;
C家族主要包括:csh、tcsh;主要用于Unix
Bash:Bash与sh兼容,现在使用的Linux就是使用bash作为用户的基本Shell。

3.Linux支持的Shell
保存在/etc/shells目录下
[root@localhost ~]# vi /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
[root@localhost ~]# sh
sh -4.1# exit
exit
[root@localhost ~]# csh
[root@localhost ~]# exit
exit
[root@localhost ~]#

那么如何判断我们进入的当前shell类型呢,使用echo $SHELL可以查看当前Shell

[root@localhost ~]# echo $SHELL
/bin/bash
父shell:初始时进入的Shell
子Shell:后面调用的Shell

二、脚本执行方式
1.echo输出命令
echo [选项][输出内容]
选项:
-e :支持反斜线控制的字符转换
控制字符:
\a :输出警告音
\b :退格键,也就是向左删除键
\n :换行符
\r :回车键
\t :制表符,也就是Tab键
\v :垂直制表符
\0nnn :按照八进制ASCll码表输出字符。其中0为数字0,nnn为三位八进制数
\xhh :按照十六进制ASCll码表输出字符。其中hh是两位十六进制数
[root@localhost ~]# echo “what do you want to do?”
what do you want to do?
[root@localhost ~]# echo -e “what do you want to\b do?”
what do you want t do?
[root@localhost ~]# echo -e “\x68\t\x65\t\x6c\n\x6c\t\x6f\t”

按照十六进制ASCⅡ码也同样可以输出

h e l
l o

注意,感叹号在echo命令中是有特殊含义的

[root@localhost ~]# echo -e “\e[1;31m Do you want do \e[0m”

输出颜色:

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

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

\e[1;:开启颜色

\e[0m:关闭颜色

2.第一个脚本

!/bin/bash

The first Shell program

echo -e “\e[1;34m 天上掉下个林妹妹 \e[0m”
wq

[root@localhost ~]# vi hello.sh

!/bin/bash标称下面所写的脚本是标准,纯Shell是不会出错,但是调用其他程序时会出错

学会写注释

3.脚本执行
(1).赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh 相对路径
(2).通过Bash调用执行脚本
bash hello.sh #用bash直接解释命令
如果脚本语法有错误可以通过:
[root@localhost ~]# vim hello.sh进行返回修改
注意用英文书写符号
[root@localhost ~]# bash hello.sh
直接调用,或者:
[root@localhost ~]# chmod 755 hello.sh
[root@localhost ~]# ll
总用量 48
-rwxr-xr-x. 1 root root 91 7月 28 11:25 hello.sh
权限变成可执行了
[root@localhost ~]# ./hello.sh
天上掉下个林妹妹
[root@localhost ~]# /root/hello.sh
天上掉下个林妹妹

三、Bash的基本功能
1.命令别名与快捷键
命令别名==小名,另外一个称呼
a.有些命令特别长,那么我们可以取个别名,方便操作
b.操作系统升级后,命令格式发生了变化,那我们可以用旧的得命令去映射新的命令

(1).alias
#查看系统中所有的命令别名
[root@localhost ~]# alias
alias cp = ‘cp -i’
alias l.= ‘ls -d .* –color=auto’

(2).alias 别名= ‘原命令’
#设定命令别名
[root@localhost ~]# vi /etc/passwd #不支持颜色
[root@localhost ~]# vim /etc/passwd #支持颜色
我们可以:
[root@localhost ~]# alias vi=’vim’

(3).别名永久生效与删除别名
vi ~/.bashrc
#写入环境变量配置文件(定义操作环境的配置文件)
进入到root下的.bashrc即兴配置即可
alias rm =’rm -i’其中-i就使用询问是否删除的

(4).unalias 别名
#删除别名

(5).命令生效顺序
第一顺序:执行用绝对路径或相对路径执行的命令
第二顺序:执行别名
第三顺序:执行Bash的内部命令,Linux自带的
第四顺序:执行按照PATH环境变量定义的目录查找顺序找到的第一个命令
[root@localhost ~]# echoPATH

(6).常用快捷键
Ctrl+c 强制终止当前命令
Ctrl+l 清屏
Ctrl+a 光标移动到命令行首
Ctrl+e 光标移动到命令行行尾
Ctrl+u 从光标所在位置删除到行首
Ctrl+z 把命令放到后台
Ctrl+r 在历时命令中搜索
[root@localhost ~]# ^c

2.历史命令
(1).历史命令
history [选项][历史命令保存文件]
选项:
- c:清空历史命令
- w:把缓存中的历史命令写入历史命令保存文件 ~/,bash_history
保存文本其实占用很小
[root@localhost ~]# ls -alh
总用量 104K
-rw——-. 1 root root 7.2K 10月 10 02:27 .bash history
可以保存起来
另外:历史命令默认会保存1000挑,可以在环境变量配置文件/etc/profile中进行修改
[root@localhost ~]# vi /etc/history
HISTSIZE=1000
可以直接修改
(2).历史命令的调用
使用上、下箭头调用以前的历史命令
使用”!n”重复执行第n条历史命令
使用”!!”重复执行上一条命令
使用”!字符串”重复执行最后一条以该字符串开头的命令
[root@localhost ~]# history#可以查看所有在有效范围出现了的历史命令记录
[root@localhost ~]# service network restart
正在关闭接口eth0: [确定]
关闭环回接口: [确定]
弹出环回接口: [确定]
弹出界面 eth0: [确定]
这个时候我们再次使用就可以这样输入命令:
[root@localhost ~]# !ser
service network restart

(3).命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或者文件时,

按一下”Tab”键会自动补全,如果存在多个相关的命令
我们可以:按两下”Tab”会弹出提示所有的相关命令
其实命令补全依赖$PATH命令,文件补全依赖与操作路径

3.输出重定向
(1).概述:
输出重定向和输入重定向:
把结果写入计算机中叫做输入,把结果显示出来叫做输出
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/sdtout 1 标准输出
显示器 /dev/sdterr 2 标准错误输出

(2).输出重定向:
类型 符号 作用
标准输出重定向 命令>文件 以覆盖的方式,把命令的正确输出输出到指定

                                  的文件或设备当中
                  命令>>文件       以追加的方式,把命令的正确输出输出到指定  

                                  的文件或设备当中

标准错误输出重定向 错误命令2>文件 以覆盖的方式,把命令的错误输出输出到指定

                                  的文件或设备当中
                 错误命令2>>文件   以追加的方式,把命令的错误输出输出到指定  

                                  的文件或设备当中

正确输出和错误输出 命令>文件 2>&1 以覆盖的方式,把命令的正确和错误输出输出

同时保存 到指定的文件当中
命令>>文件 2>&1 以追加的方式,把命令的正确和错误输出输出

                                  到指定的文件当中
                 命令&>文件        以覆盖的方式,把正确输出和错误输出都保存  

                                 在同一个文件当中
                 命令&>>文件       以追加的方式,把命令的正确和错误输出输出  

                                  到指定的文件当中
              命令>>文件1 2>>文件2 以追加的方式,把命令的正确输出保存到文件  

                                  1,把错误的输出保存到文件2

通过输出重定向,把输出结果保存起来,可以实现无人值守
[root@localhost ~]# ifconfig > test.log
[root@localhost ~]# cat test.log

输出结果:…

只要命令有输出,都可以保存到指定位置,注意>大于号会覆盖之前的结果,不想覆盖就使

用>>,如果目标文件不存在会自动创建。
如果命令不存在,或者有错误,我们应该用2>或者2>>来保存错误信息,错误信息和正确信

息应该用不同的重定向格式,注意没有空格
注意:
[root@localhost ~]# ls &>/dev/null
其中/dev/null是一个空,里面的文件会直接删除掉,那么保存的日志将会销毁,找不到了
作用:在写脚本时,不需要过程,只查看结果

(3).输入重定向
[root@localhost ~]# wc [选项][文件名]
选项:
-c 统计字节数 count
-w 统计单词数 word
-l 统计行数 list
[root@localhost ~]# wc
abd
ert

ctrl+d

  2  2   6

单词之间靠空格来分隔

命令<文件 把文件作为命令的输入,统计文件的字节数,单词数
命令<<标识符
[root@localhost ~]# wc << dy(相当于结束标记)

asd

erty
dy
4 3 11

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

4.管道符
(1).多命令顺序执行
多命令执行符 格式 作用
; 命令1; 命令2 多个命令顺序执行,命令之间没有任何逻辑联系

&& 命令1&&命令2 逻辑与(没有数据传递)
当命令1正确执行,则命令2才会执行
当命令1执行不正确,则命令2不会执行

|| 命令1||命令2 逻辑或(没有数据传递)
当命令1执行不正确时,命令2才会执行
当命令1正确执行时,命令2不会执行

注意分号是英文的;
[root@localhost ~]# ls && echo yes || echo no
acces.log ….
yes
[root@localhost ~]# lsa && echo yes || echo no
-bash: lsa:command not found
no
顺序不能颠倒: && echo yes || echo no
这里的命令1可以有多个命令,如果其中有一个命令执行了,那么命令1就是存在正确,&&会

执行,||命令2不执行
[root@localhost ~]# ls || echo no && echo yes
yes
[root@localhost ~]# lsa || echo no && echo yes
no
yes

(2)管道符
命令格式:
[root@localhost ~]# 命令1 | 命令2

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

例子:
[root@localhost ~]# ls -l /etc | more
把etc的文件分屏显示
[root@localhost ~]# netstat -an | grep ESTABLISHEN
tcp 0 52 192.168.0.156:22 192.168.0.155:1459 ESTABLISHEN

提取网络监听端口情况

[root@localhost ~]# netstat -an | grep ESTABLISHEN | wc -l
1 #统计连接结果个数

5.通配符
(1).概述:可以用来匹配其他符号的字符

通配符 作用
? 匹配任意一个字符

匹配0个或多个任意字符,也就是可以匹配任意内容

[] 匹配中括号中任意一个字符。例如:[abc]代表一定匹配其中一个字符:a或b

    或c

[-] 匹配中括号中任意一个字符,-代表一个范围,例如:[a-z]代表从a-z的一个

  小写字母  

[^] 逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配的不是一

   个数字的字符

注:除了*可以匹配多个字符,其他一次只能匹配一个
例子:
[root@localhost ~]# mkdir dy
[root@localhost ~]# cd /root/dy
[root@localhost dy]# pwd
/root/dy
[root@localhost dy]# touch dzp
[root@localhost dy]# touch dzp2
[root@localhost dy]# touch dzp3
[root@localhost dy]# touch dzp34
[root@localhost dy]# touch dzpcang
[root@localhost dy]# touch dzpbols
[root@localhost dy]# touch dzpa
[root@localhost dy]# ls
dzp dzp2 dzp3 dzp34 dzpcang dzpbols
[root@localhost dy]# ls dzp
dzp
[root@localhost dy]# ls dzp*
dzp dzp2 dzp3 dzp34 dzpcang dzpbols
[root@localhost dy]# ls dzp?
dzp2 dzp3
[root@localhost dy]# ls dzp[0-9]
dzp2 dzp3
[root@localhost dy]# ls dzp[0-9][0-9]
dzp34
[root@localhost dy]# ls dzp[^0-9]
dzpa
注:通配符主要用来匹配文件名或者文件目录,如果要匹配文件内容,需要用到正则表达式

(3).Bash中其他特殊符号:
符号 作用
” 单引号,在单引号中所有的特殊符号,如“$”和“`”和“\”都没有特殊含义

“” 双引号。在双引号中特殊符号都没有特殊含义,但是“”和“‘”和“\”例外拥有“调用变量的值”,“引用命令”和“转义符”的特殊含义“反引号。反引号括起来的内容是系统命令,在Bash中会先执行它,和()作用一

       样,不过推荐使用$(),反引号容易看错

$() 和反引号作用一样,用来引用系统命令

# 在shell脚本中,#开头的行代表注释

用于调用变量的值,如需要调用变量name的值时,需要使用name的方式得到变

       量的值

\ 转义符,跟在\之后的特殊符号都将失去意义,变成普通字符,如$将输出“$

     ”符号,而不是当作变量引用

[root@localhost dy]# a=123
[root@localhost dy]# echo a
123
[root@localhost dy]# echo ‘a’
a
[root@localhost dy]# echo “a”
123
[root@localhost dy]# a=ls
[root@localhost dy]# echo “$a”
ls
[root@localhost dy]# a=ls
[root@localhost dy]# echo “a”dzpdzp2dzp3dzp34dzpcangdzpbolsdzpa一般不是用“容易和”单引号混淆,我们可以使用()

相关内容