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 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
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 垂直制表符
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 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
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+U或Ctrl+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、输入文本
3、Ctrl+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的和是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 "$*"
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"