linux_shell基础
Shell是一个"命令行解释器",它为用户提供了一个向Linux内核发送请求以便运行程
序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
同时也是一个"功能相当强大的编程语言",易编写,易调试,灵活性较强。Shell是解
释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
echo
echo输出的内容如果有空格则需要额外加上引号
感叹号有特殊作用,加双引号不能正确执行,加但引号可以
echo [选项][输出内容]
-e
选项支持反斜线控制的字符转换
控制字符 | 作用 |
---|---|
|输出\本身 | |
\a | 输出警告音 |
\b | 退格键 |
\c | 取消输出行末的换行符,和"-n"选项一致 |
\e | ESCAPE键 |
\f | 翻页 |
\n | 换行 |
\r | 回车键 |
\t | 制表符 |
\v | 垂直制表符 |
\0nnn | 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数 |
\xhh | 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数 |
第一个脚本
#!/bin/Bash
#The first program
#Author: Alex (Email: Alex@example.com)
echo "hello world"
脚本执行
- 赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
- 通过bash调用执行脚本
bash hello.sh
历史命令与命令补全
历史命令
history [选项] [历史命令保存文件]
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件"~./bash_history"
注意:
- 历史命令默认会保存1000条,可以在环境变量配置文件
/ect/profile
中进行修改 - 使用上下箭头可以调用以前的历史命名
- 使用"!n"重复执行第"n"条命令
- 使用"!!"重复执行上一条命令
- 使用"!字串"重复执行最后一条以该字串开头的命令
命令补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全
命令别名"alias"
设定别名:alias 别名="原命令"
查询别名:alias
命令执行顺序
- 第一顺位执行用"绝对路径"或"相对路径"执行的命令。
- 第二顺位执行别名。
- 第三顺位执行Bash的内部命令。
- 第四顺位执行按照
$PATH
环境变量定义的目录查找顺序找到的第一个命令。
让别名永久生效
可以写入到/home/username/.bashrc
中
理解.bashrc
,可查看linux环境变量
删除别名
unalias 别名
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 | 恢复屏幕输出 |
输入输出重定向
标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin |
0 | 标准输入 |
显示器 | /dev/sdtout |
1 | 标准输出 |
显示器 | /dev/sdterr |
2 | 标准错误输出 |
输出重定向
标准输出重定向
符号 | 作用 |
---|---|
命令 > 文件 |
以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中 |
命令 >> 文件 |
以追加的方式,把命令的正确输出输出到指定的文件或设备当中 |
标准错误输出重定向
符号 | 作用 |
---|---|
错误命令 2> 文件 |
以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中 |
错误命令 2>> 文件 |
以追加的方式,把命令的错误输出输出到指定的文件或设备当中 |
正确输出和错误输出同时保存
符号 | 作用 |
---|---|
命令 > 文件 2>&1 |
以覆盖的方式,把正确输出和错误输出都保存到同一个文件中去 |
命令 >> 文件 2>&1 |
以追加的方式,把正确输出和错误输出都保存到同一个文件中去 |
命令 &> 文件 |
以覆盖的方式,把正确输出和错误输出都保存到同一个文件中去 |
命令 &>> 文件 |
以追加的方式,把正确输出和错误输出都保存到同一个文件中去 |
命令 >> 文件1 2>>文件2 |
把正确输出追加到"文件1"中,把错误输出追加到"文件2"中 |
注意:"2"等符号之间沒有空格,命令文件等与符号之间可以有空格
输入重定向
- 把文件作为命令的输入
命令 < 文件
- 把标识符之间内容作为命令的输入
命令 << 标识符
...
标识符
举例:
wc [选项] [文件名]
-c 统计字节数
-w 统计单词数
-l 统计行数
多命令的顺序执行
多命令顺序执行
多命令执行符 | 格式 | 作用 |
---|---|---|
; |
命令1; 命令2 |
多个命令顺序执行,命令之间没有任何逻辑联系 |
&& |
命令1&& 命令2 |
逻辑与:1执行,2才会执行;1执行不正确,2不会执行 |
|| |
命令1|| 命令2 |
逻辑或:1执行,2不会执行;1执行不正确,2执行 |
管道符
命令1作为命令2的操作对象
命令1|命令2
例如:cat file|pager
分页显示
grep搜索
grep [选项] "搜索内容" 文件名
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
--color=auto 搜索出的关键字用颜色显示
通配符与其他符号
通配符
通配符 | 作用 |
---|---|
? | 匹配任意一个字符 |
* | 匹配0个或任意多个字符,也就是任意内容 |
[ ] | 匹配中括号中任意一个字符,例如:[ab]就是匹配a或b |
[-] | 匹配中括号中一个字符,例如:[a-c]就是匹配a,或b,或c |
[^] | 逻辑"非"匹配不是括号中的一个字符 |
bash中的其他符号
符号 | 作用 |
---|---|
'' | 单引号:在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义。 |
"" | 双引号:在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。 |
`` | 反引号:反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。 |
$() | 和反引号作用一样,用来引用系统命令。 |
# | 在Shell脚本中,#开头的行代表注释。 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name 的方式得到变量的值。 |
\ |
转义符:跟在\ 之后的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不当做是变量引用。 |
例子:
$ echo "date"
date
$ echo "$(date)"
Mon Jul 31 14:52:54 CST 2017
$ greet="hello linux"
$ echo greet
greet
$ echo $greet
hello linux
用户自定义变量
变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
变量设置规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的
- 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
- 变量用等号连接值,等号左右两侧不能有空格。
- 变量的值如果有空格,需要使用单引号或双引号包括。
- 在变量的值中,可以使用“\”转义符。
- 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
- 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
- 环境变量名建议大写,便于区分。
变量分类
- 用户自定义变量
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
本地变量(用户自定义变量)
变量定义
$ name="alex zhang"
变量叠加
$ aa=123
$ aa="$aa"456
$ aa=${aa}789
变量调用
$ echo $name
变量查看
$ set
变量删除
$ unset name
环境变量
用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
设置环境变量
一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。export将变量申明为全局变量
- 申明变量:
export 变量名=变量值
或者export 本地变量名
,申明该本地变量为环境变量 - 查询变量:
env
- 删除变量:
unset 变量名
系统常见环境变量
PATH:系统查找命令的路径
PATH变量叠加:PATH="$PATH":/username/project
三种修改环境变量的方式:
-
PATH="$PATH":/username/project
直接叠加环境变量,临时有效 -
vi /etc/profile
在适当位置添加PATH="$PATH":/username/project
,所有用户有效 -
vi ~/.bash_profile
修改PATH行,添加PATH="$PATH":/username/project
,当前用户有效
注意:
将/username/project
添加到环境变量,该目录下的脚本文件可以直接执行,而不再需要”绝对路径“或”相对路径“,比如正常需要执行脚本文件”hello.sh“需要chmod 755 hello.sh
然后./hello.sh
或/username/project/hello.sh
才能执行,这时只需hello.sh
就可直接执行
PS1
定义系统提示符的变量
\d:显示日期,格式为“星期 月 日”
\h:显示简写主机名。如默认主机名“localhost”
\t:显示24小时制时间,格式为“HH:MM:SS”
\T:显示12小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户
会显示提示符为“$”
例子:
alex@alex-zh ~ $ PS1='[\u@\t \w]\$ '
[alex@16:14:28 ~]$ PS1='[\u@\t \#\w]\$ '
[alex@16:14:59 20~]$ PS1='\u@\H \w \$ '
alex@alex-zh ~ $
位置参数变量
位置参数 | 作用 |
---|---|
$n | n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10} |
$* | 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
例子:
#!/bin/bash
#
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum
$*
与$@
区别
$*
中的所有参数看成是一个整体,所以这个 for 循环只会循环一次
$@
中的每个参数都看成是独立的,所以“ $@ ”中有几个参数,就会循环几次
Bash运算符
数值运算与运算符
linux Shell中,所有变量默认为字符串
declare声明变量类型
declare [+/-][选项]变量名
选项 | 变量 |
---|---|
- | 给变量设定类型属性 |
+ | 给变量取消类型属性 |
-i | 将变量声明为整数型 |
-x | 将变量声明为环境变量 |
-p | 显示指定变量的被声明类型 |
选项:
选项 | 变量 |
---|---|
- | 给变量设定类型属性 |
+ | 给变量取消类型属性 |
-i | 将变量声明为整数型 |
-x | 将变量声明为环境变量 |
-p | 显示指定变量的被声明类型 |
数值运算
- 方法1
$ aa=11
$ bb=22
$ declare -i cc=$aa+$bb # 声明为整数型
- 方法2:expr或let数值运算工具
$ aa=11
$ bb=22
$ dd=$(expr $aa + $ bb) # dd是aa和bb值的和,“+”号左右有空格
- 方法3:$((运算式))或$[运算式]
$ aa=11
$ bb=22
$ ee=$(($aa+$bb))
$ ff=$[$aa+$bb]
运算符
优先级 | 运算符 | 说明 |
---|---|---|
13 | -, + | 单目负、单目正 |
12 | !, ~ | 逻辑非、按位取反或补码 |
11 | *, /, % | 乘除取模 |
10 | +, - | 加,减 |
9 | <<, >> | 按位左移、按位右移 |
8 | < =, > =, <, > | 小于或等于、大于或等于、小于、大于 |
7 | ==, != | 等于、不等于 |
6 | &按位与 | |
5 | ^ | 按位异或 |
4 | | | 按位或 |
3 | && | 逻辑与 |
2 | || | 逻辑或 |
1 | +, =, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= | 赋值、运算且赋值 |
变量测试与内容替换
变量置换方式 | 变量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 |
环境变量配置文件
环境变量会在一系列shell中有效,本地变量在本shell窗口有效。环境变量比本地变量适用范围多一些,修改环境变量文件永久性的更改环境变量
source命令
修改了配置文件,需要退出再重新登陆才能生效。而source或者“.”避免了这个过程
用法1:source 配置文件
用法2:. 配置文件
- /etc/profile
- 作用:USER变量,LOGNAME变量,MAIL变量,PATH变量,HOSTNAME变量,umask
- 调用/etc/profile.d/*.sh
- /etc/profile.d/*.sh
- 所有".sh"结尾的文件
- ~/.bash_profile
- home目录,对当前用户有效
- 调用~/.bashrc
- 在PATH变量后面加入了
:$home/bin
这个目录
- ~/.bashrc
- home目录,当前用户有效
- 定义默认别名
- 调用
/etc/bashrc
- /etc/bashrc
- PS1 变量
- umask
- PATH变量
- 调用
/etc/profile.d/*.sh