Shell基础1

0 Shell基础

0.1 Shell是什么

0.1.1 Shell是什么

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

硬件 <-内核 <- Shell命令解释器<-外层应用程序

            0101                                          ls

 

Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性强。

Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

 

0.1.2 Shell的分类

Bourne Shell:从1979年起UNIX就开始使用bourne Shellbourne Shell的主文件名为sh

C ShellC Shell主要在BSD版的UNIX系统中使用,其语法和C语言相类似而得名

 

Shell的两种主要语法类型有BourneC,这两种语法彼此不兼容。

Bourne家族主要包括shkshBashpshzsh

C家族主要包括cshtcsh

 

BashBashsh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell

 

0.1.3 Linux支持的Shell

/etc/shells文件中记录的是系统支持的shell

sh   #此命令用于启动Shell

exit  #此命令用于退出Shell

 

0.2 Shell脚本的执行方式

0.2.1 echo输出命令

echo 选项 变量

作用:将变量显示到标准输出

选项:

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

 

\\ 输出\本身

\a 输出警告音

\b 退格键,向左删除   

\c 取消输出行末的换行符

\e ESCAPE

\f 换页符

\n 换行符

\r 回车键

\t 制表符,也就是tab

\v 垂直制表符


\0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数。

\xhh  按照十六进制ASCII码表输出字符。其中hh是两位十六进制数


例子:

echo -e "ab\bc"

#输出结果是ac

echo -e "\e[1;31mabcd\e[0m"

#输出颜色,abcd为输出内容   

30m黑  31m红  32m绿  33m黄  34m蓝  35m洋红  36m青  37m

0.2.2 第一个脚本

vi hello.sh

 

#!/bin/bash

#The first program

#Author:haha (E-mail:haha@xxx.com)

 

echo -e "hello world"

 

0.2.3 执行脚本

赋予执行权限,直接运行

chmod 755 hello.sh

./hello.sh

 

通过bash调用执行脚本,此时不必有执行权限

bash hello.sh

 

cat -A 文件名

#查看隐藏字符,如换行符

 

dos2unix 文件名

#windows格式转换成UNIX格式

 

unix2dos 文件名

#UNIX格式转换成windows格式

 

0.3 bash的基本功能

历史命令与命令补全

0.3.1 历史命令

history 选项 文件名(历史命令保存文件)

选项:

-c 清空历史命令

-w 把缓存中的历史命令写入历史命令保存文件(在各自的家目录中)~/.bash_history

history -c  #清空缓存历史命令

history -w  #将缓存的历史命令写入~/.bash_history

history -w tmp.txt  #将缓存的历史命令写入tmp.txt

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

 

历史命令的调用

使用上、下箭头调用以前的历史命令

使用!n”重复执行第n条历史命令

使用!!”重复执行上一条命令

使用!字串”重复执行最后条以该字串开头的命令

 

 

0.3.2 命令与文件补全

bash中,命令与文件补全是非常方便与常用的功能

只要在输入命令或文件时,按“Tab”键就会自动进行补全

 

0.4 命令别名与常用快捷键

0.4.1 命令别名

alias 别名='原命令'

#设定命令别名,临时生效

 

alias

#查询命令别名

 

命令执行时顺序

1、第一顺位执行用绝对路径或相对路径执行的命令

2、第二顺位执行别名

3、第三顺位执行bash内部命令

4、第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

   

echo $PATH 打印环境变量的路径

 

让别名永久生效:修改家目录下的.bashrc文件

vi /root/.bashrc

 

删除别名

unalias 别名

 

0.4.2 bash常用快捷键

Ctrl+A 把光标移动到命令行开头

Ctrl+E 把光标移动到命令行结尾

Ctrl+C 强制终止当前的命令

Ctrl+L 清屏,相当于clear命令

Ctrl+U 删除或剪切光标之前的命令

Ctrl+K 删除或剪切光标之后的命令

Ctrl+Y 粘贴Ctrl+UCtrl+K剪切的内容

Ctrl+R 在历史命令中搜索,按下Ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。

Ctrl+D 退出当前终端 相当于logout

Ctrl+Z 暂停并放入后台

Ctrl+S 暂停屏幕输出

Ctrl+Q 恢复屏幕输出

 

0.5 输入输出重定向

0.5.1标准输入输出

设备    设备文件名    文件描述    类型

键盘      /dev/stdin       0       标准输入

显示器  /dev/stdout      1       标准输出

显示器   /dev/sdterr      2       标准错误输出

 

0.5.2输出重定向

   类型               符号               作用

标准输出重定向     

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

命令 >>文件  以追加的方式

 

标准错误输出重定向 

错误命令 2>文件      覆盖

错误命令 2>>文件     追加

 

 

正确输出和错误输出同时保存)

命令 >文件 2>&1    覆盖

命令 >>文件 2>&1   追加

命令 &>文件    覆盖

命令 &>>文件   追加

 

正确输出和错误输出分别保存)           

命令 >>文件1  2>>文件2    正确追加文件1  错误追加文件2

 

ls &>/dev/null    #丢弃没用的输出信息ls,不管命令输出什么,执行就好

 

0.5.3 输入重定向 

(用的不多,用于给源码包打补丁)

wc 选项 文件名

选项

-c 统计字节数

-w 统计单词数

-l 统计行数

 

1、命令wc,回车

2、输入文本

3Ctrl+D #统计输入的行数、单词数、字符数

 

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

wc<anaconda-ks.cfg  统计anaconda-ks.cfg文件

wc<<flag

>asdg

>afsda

>gerge

>flag

#统计两个flag之间的内容(flag是标志)

 

0.6 多命令顺序执行与管道符

0.6.1 多命令顺序执行

多命令执行符    格式             作用

           命令1;命令2     多条命令顺序执行,命令之间没有任何逻辑联系

     &&     命令1 &&命令2    逻辑与:命令1正确执行,命令2执行,否则命令2不执行

     ||        命令1 ||命令2     逻辑或:命令1不正确执行,命令2执行,否则命令2不执行

 

dd用于磁盘复制

dd if=输入文件 of=输出文件bs=字节数count=个数

 

选项:

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

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

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

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

 

例子

date; dd if=/dev/zero of=/root/testfile bs=1k count=10000; date

#判断复制硬盘用了多长时间

 

命令&&echo yes||echo no

#可以判断命令是否正确

 

0.6.2管道符

命令1 |命令2

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

 

例子

ll -a /etc/ | less

netstat -an | grep "ESTABLISHED"

 

grep 选项 “搜索内容” 文件名

选项:

-i 忽略大小写

-n 输出行号

-v 反向查找

--color=auto 搜索出的关键字用颜色标识

 

0.7 多命令顺序执行与管道符

0.7.1 通配符

匹配一个字符

*  匹配多个字符

[] 匹配中括号中的一个字符。如[abc]

[-] 匹配一个范围。如[a-f]

[^] 匹配不是中括号内的一个字符。如[^0-9],代表匹配一个不是数字的字符

例子:

rm -rf * #清空

ls ?abc

ls [0-9]*

ls [^0-9]*

0.7.2 bash中其他特殊符号

' '  单引号 特殊符号如“$”和“`(反引号)都没有特殊含义

" "  双引号

$ 代表调用变量的值  

`引用命令  

\ 转义字符

` `  反引号 内容是系统命令,在bash中先执行

$() 同反引号

# 注释

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

\ 转义字符,跟在其后的特殊符号失去作用

 

例子

name=sc

echo $name

echo '$name'

echo "$name"

 

引用一个命令

abc=`date`  或者  abc=$(date)

echo $abc

 

echo '$(date)'

echo "$(date)"

 

0.8 bash变量

0.8.1 什么是变量

变量是计算机内存的单元,其中存放的值可以改变。

Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。

每一个变量有一个名字,所以很容易引用它。

使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。

0.8.2 变量设置规则

由字母、数字、下划线组成,以字母、下划线开头。

默认类型是字符串型

用等号连接,不能有空格

值有空格,用引号引起来

值可以使用转义字符

值可以叠加。$变量名” 或者  ${变量名}

把命令结果作为变量值赋予变量 ` `  $()  

环境变量名大写

 

0.8.3 变量分类

用户自定义变量

环境变量:保存和系统操作环境相关的数据

位置参数变量:向脚本当中传递参数,变量名不能自定义,变量作用是固定的

预定义变量:bash中已经定义好的变量,变量名不能自定义,变量作用是固定的

 

0.8.4 本地变量(用户自定义变量)

例子:

name="ha ha"

 

变量叠加

aa=123

aa="$aa"456

aa=${aa}789

 

变量调用

echo $name

 

变量查看(系统所有变量)

set

 

变量删除

unset name

 

0.9 环境变量

0.9.1 环境变量是什么?

用户自定义变量只在当前Shell中生效

环境变量在当前Shell和这个Shell的所有子Shell当中生效

如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效

 

0.9.2 设置环境变量

export 变量名=变量值

#声明变量

 

exprot 变量名

#将已声明的本地变量变为环境变量

 

env

#查询变量

 

unset 变量名

#删除变量

 

bash

#进入子Shell


pstree

#查看进程树

0.9.3 系统常见环境变量

PATH:系统查找命令的路径

echo $PATH


PATH="&PATH":/root/sh

#PATH变量叠加,命令行临时改变

 

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

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

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

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

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

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

\@  HH:MM AM/PM

\u  显示当前用户

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

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

\#  执行的第几个命令

\$  提示符。root#

 

PS1='[\u@\h \W]\$ '

例子

PS1='[\u@\@ \h \# \W]\$ '

 

0.10 位置参数变量

$n  n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}

$*  代表命令行所有参数,$*把所有参数看成一个整体   

$@ 也代表命令行中所有的参数,不过$@把每个参数区分对待

$#  代表命令行中所有参数的个数

 

例子1

#!/bin/bash

num1=$1

num2=$2

sum=$(($num1 + $num2))

#变量sum的和是num1num2

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 "$*"

    do

        echo "$i"

    done

 

for i in "$@"

    do

        echo "$i"

    done

 

0.11 预定义变量

其实位置参数变量就是预定义变量的一种

 

$?  最后一次执行命令的返回状态。为0则表示正确执行。

$$  当前进程的进程号(PID

$!  后台运行的最后一个进程的进程号

 

 

例子 variable.sh

#!/bin/bash

 

echo "The current process is $$"

#输出当前进程的PID

#这个PID就是variable.sh这个脚本执行时,生成进程的PID

 

find /root -name hello.sh &

#使用find命令在root目录下查找hell.sh文件

#符号&的作用是把命令放入后台执行

 

echo "The last one Daemon process is $!"

 

接受键盘输入

read 选项 变量名

选项:

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

-t 秒数:    指定等待时间

-n 字符数:  指定字符数

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

 

 

例子

#!/bin/bash

 

read -t 30 -p "Please input your name: " name

echo "Name is $name"

 

read -s -t 30 -p "Please enter your age: " age

echoo  " "

echo "Age is $age"

 

read -n 1 -t 30 -p "Please select your gender[M/F]:" gender

echo  " "

echo "Sex is $gender"


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值