首先作为一个开发者我们需要知道我们所学习的东西的使用用处!shell脚本作为应用程序和linux内核中间件!应用程序调用shell脚本,linux内核执行相关脚本,返回结果给应用程序!
shell脚本输出命令
echo [选项] [输出内容]
选项:
-e:支持反斜线控制的字符转换(具体参见表 1)
-n:取消输出后行末的换行符号(内容输出后不换行)
例子: 输出"hello world": echo -e "\"hello world\""
注意: echo 命令中如果使用了"-e"选项,则可以支持控制字符
控制字符 作 用
\\ 输出\本身
\a 输出警告音
\b 退格键,也就是向左删除键
\c 取消输出行末的换行符。和“-n”选项一致
\e Esc键
\f 换页符
\n 换行符
\r 回车键
\t 制表符,也就是Tab键
\v 垂直制表符
\Onnn 按照八进制 ASCII 码表输出字符。其中 0 为数字 0,nnn 是三位八进制数
\xhh 按照十六进制 ASCH 码表输出字符。其中 hh 是两位十六进制数
查看历史命令
history [选项] [历史命令保存文件]
选项:
-c:清空历史命令
-w:把缓存中的历史命令写入历史命令保存文件中。如果不手工指定历史命令保存文件,则放入默认历史命令保存文件 ~/.bash_history 中
对于简化管理操作、排查系统错误都有重要的作用,而且使用简单方便,建议大家多使用历史命令
例子: 输出过去命令历史: history
使用上、下箭头调用以前的历史命令
使用"!n"重复执行第 n 条历史命令
使用"!!"重复执行上一条命令
使用"!字符串"重复执行最后一条以该字符串开头的命令
使用"!$"重复上一条命令的最后一个参数
命令快速自动补全
在 Bash 中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时按 Tab,就会自动进行补全
Bash 常用快捷键
快捷键 作 用
Ctrl+A 把光标移动到命令行开头。如果我们输入的命令过长,则在想要把光标移动到命令行开头时使用
Ctrl+E 把光标移动到命令行结尾
Ctrl+C 强制中止当前的命令
Ctrl+L 淸屏,相当于 clear 命令
Ctrl+U 刪除或剪切光标之前的命令。假设输入了一行很长的命令,无须使用退格键一个一个字符地刪除, 使用这个快捷键会更加方便
Ctrl+K 删除或剪切光标之后的内容
Qrl+Y 粘贴 Ctrl+U 或 Ctrl+K 剪切的内容
Ctrl+R 在历史命令中搜索,按下 Ctrl+R 组合键之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
Ctrl+D 退出当前终端
Ctrl+Z 暂停,并放入后台。这个快捷键涉及工作管理的内容,我们会在后续中详细介绍
Ctrl+S 暂停屏幕输出
Ctrl+Q 恢复屏幕输出
Linux标准输入输出
输出
在输出重定向中,">"代表的是覆盖,">>"代表的是追加
不同标准输入输出: 例子 history >> ./command.log history命令的结果就会追加到当前目录的command.log文件内容中
例子: 系统中并不存在test这样的一个目录,但是如果我执行ls test -al命令的话,系统就会报错!如何将错误信息保存在相关错误log中呢?
首先想到的是通过标准输入输出来记录,如:ls test -al >> ./err.log然而事与愿违,错误信息并未追加到err.log中,后来发现
2 代表错误输出,只有这样才能把命令的错误输出保存到指定的文件中。这里大家需要注意"2>>"一定不能有空格,否则会报错
正确的写法是 ls test -al 2>>./err.log
类型符号 作 用
标准输出重定向 命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定的文件或设备中
命令 >> 文件 以追加的方式,把命令的正确输出输出到指定的文件或设备中
标准错误输出重定向 错误命令2 > 文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备中
错误命令2 >> 文件 以追加的方式,把命令的错误输出输出到指定的文件或设备中
正确输出和错误输出同时保存 命令 > 文件2>&1 以捜盖的方式,把正确输出和错误输出都保存到同一个文件中
命令 >> 文件2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件中
命令&>文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中
命令&>>文件 以追加的方式,把正确输出和错误输出都保存到同一个文件中
命令>>文件1 2>>文件2 把正确的输出追加到文件1中,把错误的输出追加到文件2中
上的方式虽然可行,但是在实际操作中,并不会这样做。实际操作中尽量将正确或错误的输出全部保存在同一个文件中
例子: 将正确或错误的输出全部保存在同一文件中 ls test -al >>./command.log 2>&1
输入
wc [选项] [文件名]
选项:
-c:统计字节数
-w:统计单词数
-l:统计行数
shell(bash)多命令顺序执行
多命令执行符 格 式 作 用
; 命令1 ; 命令2 多条命令顺序执行,命令之间没有任何逻辑关系
&& 命令1 && 命令2 如果命令1正确执行($?=0),则命令2才会执行
如果命令1执行不正确($?≠0),则命令2不会执行
II 命令1 || 命令2 如果命令1执行不正确($?≠0),则命令2才会执行
如果命令1正确执行($?=0),则命令2不会执行
grep 提取符合条件的字符串行(在文件中提取和匹配符合条件的字符串行)
grep [选项] "搜索内容" 文件名
选项:
-A 数字:列出符合条件的行,并列出后续的 n 行;
-B 数字:列出符合条件的行,并列出前面的 n 行;
-c:统计找到的符合条件的字符串的次数;
-i:忽略大小写;
-n:输出行号;
-v:反向査找;
--color=auto:搜索出的关键字用颜色显示
grep 是行提取命令,所以只要一行数据中包含"搜索内容",就会列出整行的数据
例子: 查找用户信息文件/etc/passwd中有多少可以登录的用户: grep "/bin/bash" /etc/passwd
和find命令的区别: find命令是完全匹配查找,而grep是包含匹配查找
shell通配符用法
通配符 作 用
? 匹配一个任意字符
* 匹配 0 个或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符。例如,[abc] 代表一定匹配一个字符,或者是 a,或者是 b,或 者是 c
[-] 匹配中括号中任意一个字符,- 代表一个范围。例如,[a-z] 代表匹配一个小写字母
[^] 逻辑非,表示匹配不是中括号内的一个字符。例如,[^0-9] 代表匹配一个不是数字的字符
例子:假设当前目录下存在 011,0abc,abc三个目录
ls ?abc 的结果是 0abc,并不会存在abc,因为?不能匹配空
ls 0* 的结果是 011,0abc
ls [0-9]* 的结果是 011,0abc
ls [^0-9]* 的结果是 abc
单引号,双引号,反引号
单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义
双引号括起来的字符中,"$"、"\"和反引号是拥有特殊含义的,"$"代表引用变量的值
反引号代表引用命令
例子: 定义变量 $ name=stephen
echo "$name" 结果: stephen 注意:双引号如果需要输出$,`则需要加转义符'\'
echo '$name' 结果: $name
echo `date` 结果: Thu 12/27/2018 注意:反引号里面的内容只能是shell命令
Shell(Bash)小括号和大括号用法及区别
小括号和大括号的区别主要在于:
() 执行一串命令时,需要重新开启一个子 Shell 来执行。
{} 执行一串命令时,在当前 Shell 中执行。
() 和 {} 都是把一串命令放田括号里面,并且命令之间用";"隔开。
() 最后一条命令可以不用分号。
{} 最后一条命令要用分号。
{} 的第一条命令和左括号之间必须有一个空格。
() 里的各命令不必和括号有空格。
() 和 {} 中括号里面的某条命令的重定向只影响该命令,但括号外的重定向则会影响到括号里的所有命令
Bash变量定义及规范
变量名命名规范:只能存在字母,数字,下划线,但数字不能作为变量名的开头,例如:'3name'这是错误的变量命名
变量用等号"="连接值,"="左右两侧不能有空格
变量值中如果有空格,则需要使用单引号或双引号包含,如 test="hello world!"
双引号括起来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符
在变量值中,可以使用转义符"\"
(Shell)Bash用户自定义变量及使用
用户自定义变量只需要遵守规则: 变量名=变量值,注意‘=’符号两边不能存在空格,否则linux会把它当做系统命令执行,从会出现报错的情况。
set 命令可以用来查看系统中的所有变量(用户自定义变量和环境变量)和设定 Shell 的执行环境
env只能用来查看系统中的环境变量
例子环境变量内容叠加
1.首先在系统内存在PATH环境变量
2.我们在/home/stephen/sh路径下存在demo.sh脚本
3.我们在PATH环境变量下添加/home/stephen/sh路劲
4.命令如下: PATH=$PATH:/home/stephen/sh
5.我们现在可以在系统任意目录下执行demo.sh脚本,而不需要执行脚本路径了
Shell环境变量设置方法详解
环境变量和用户自定义变量的唯一区别是:环境变量是全局变量,而用户自定义变量是局部变量。
定义环境变量的方式是:定义好自定义变量后,采用export命令将自定义变量声明为环境变量即可。
Shell PATH变量用法详解:系统查找命令的路径
echo $PATH 查看系统PATH环境变量 :/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
被定义到PATH环境变量中的路径下的脚本是可以直接运行的,系统会自动在path环境变量下面去寻找路径
注意':'分隔路径
Shell PS1变量:命令提示符设置
PS1变量可以用来帮助用户自定义命令提示符,就是terminal中每行命令前面的那一串(即为提示符)
\d:显示曰期,格式为"星期 月 日"
\H:显示完整的主机名。如默认主机名"localhost.localdomain"
\h:显示简写的主机名。如默认主机名"localhost"
\t:显示 24 小时制时间,格式为"HH:MM:SS"
\T:显示 12 小时制时间,格式为"HH:MM:SS"
\A:显示 24 小时制时间,格式为"HH:MM"
\@:显示 12 小时制时间,格式为"HH:MM am/pm"
\u:显示当前用户名
\v:显示 Bash 的版本信息
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\#:执行的第几条命令
\$:提示符。如果是 root 用户,则会显示提示符为"#";如果是普通用户,则会显示提示符为"$"
执行echo $PS1命令,可以看到类似如下结果[\u@\h \W]\$
修改命令提示符: PS1='[\u@\h \w]\$' 需要注意的是PS1变量的内容必须要用单引号才能生效,否则报错
Shell(Bash)位置参数变量用法
在linux中,若一条命令或者脚本执行时,后面可以跟着一系列参数,我们采用位置参数变量来表示这些参数。
位置参数变量 作 用
$n n 为数字,$0 代表命令本身,$1〜$9 代表第 1〜9 个参数,10 以上的参数需要用大括号包含, 如${10}
$* 这个变量代表命令行中所有的参数,把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待
$# 这个变量代表命令行中所有参数的个数
例子: 具体参数变量使用,去运行此脚本内容即可知晓
#!/bin/bash
x=$1
y=$2
z=$(($x + $y))
echo $z
echo /$* parameters is $*
echo /$@ parameters is $@
j=0
for i in "$*"
do
echo "The parameters is: $i"
j=$(($j+1))
done
echo "j is:$j"
x=0
for y in "$@"
do
echo "the Parameters $x id $y"
x=$(($x+1))
done
echo "x is: $x"
Shell 预定义变量
预定义变量是在 Shell 一开始时就定义的变量,这一点和默认环境变量有些类似
预定义变量 作 用
$? 最后一次执行的命令的返回状态。如果这个变量的值为 0,则证明上一条命令正确执行;如果这 个变量的值为非 0 (具体是哪个数由命令自己来决定),则证明上一条命令执行错误
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
echo "the current process id is:" $$
grep "echo" ./test.sh &
echo "the last process id is:" $!
注意:上面shell脚本的第二句的&符号,表示将该‘grep "echo" ./test.sh’命令放入后台执行
Shell接收键盘输入或其他文件描述符的输入 read
[root@localhost ~]# read [选项] [变量名]
[选项]
-p "提示信息":在等待read输入时,输出提示信息
-t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数:read命令只接收指定的字符数就会执行
-s: 隐藏输入的数据,适用于机密信息的输入
[变量名]
变量名可以自定义。如果不指定变量名,则会把输入保存到默认变量REPLY中;
如果只提供了一个变量名,则将整个输入行赋予该变量;
如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有字;
例子:
read -t 30 -p "please input x:" x
echo "user input x:" $x
read -t 30 -p "please input y:" y
echo "user input y:" $y
echo "x+y=" $(($x+$y))
例子2:
username=stephen
password=root
read -t 30 -p "please enter username" uname
read -t 30 -p "please enter password" passwd
if [ "$username" = "uname" ] && [ "$password" = "$passwd" ];then
echo "login success!"
else
echo "login failed!"
fi
Shell数值运算
首先用户需要注意的是,脚本命令定义的变量默认为”字符串型“
例如:
x=3
y=4
z=$x+$y
echo "x+y="$z 输出结果是x+y=3+4
这里我们就可以发现,shell变量默认类型为“字符串型”
如何声明变量类型
1.使用declare声明变量类型
declare [+/-] [选项] 变量名
选项:
-:给变量设定类型属性
+:取消变量的类型属性
-a:将变量声明为数组型
-i:将变量声明为整数型(integer)
-r:将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过 +r 取消只读属性
-x:将变量声明为环境变量
-p:显示指定变量的被声明的类型
我们使用declare重写上面的例子:
x=3
y=4
declare -i z=$x+$y
echo "x+y="$z
2.数组类型定义及使用
直接上例子:
comment[0]=I
comment[1]=love
comment[2]=you
echo ${comment}
输出结果是:I love you
3.申明环境变量
在之前我们已经学习了使用export将变量声明为环境变量,但是此次我们学习使用declare来申明环境变量
例子:declare -x test
4.采用linux运算命令来进行数值运算
expr或let
重写案例一的方案:使用expr
x=3
y=4
z=$(expr $x + $y) (注意: 在使用 expr 命令进行运算时,要注意"+"号左右两侧必须有空格,否则运算不执行)
echo "x+y="$z
重写案例一的方案:使用let
x=3
y=4
let z=$x+$y
echo "x+y="$z
5.使用"$((运算式))"或"$[运算式]"方式运算
重写案例一: 使用$((运算式))
x=3
y=4
z=$(( $x+$y ))
echo "x+y="$z
重写案例二: 使用$[运算式]
x=3
y=4
z=$[$x+$y]
echo "x+y="$z
6. 取消变量的设置
unset 变量名 (相当于删除变量)
Shell常用运算符
数值越大优先级越高
优先级 运算符 说 明
13 -,+ 单目负、单目正
12 !,~ 逻辑非、按位取反或补码
11 *, /, % 乘、除、取模
10 +, - 加、减
9 <<, >> 按位左移、按位右移
8 <=, >=, <, > 小于或等于、大于或等于、小于、大于
7 == ,!= 等于、不等于
6 & 按位与
S ^ 按位异或
4 | 按位或
3 && 逻辑与
2 II 逻辑或
1 =,+=,•=,*=,/=,%=,&=, |=, <<=, >>= 赋值、运算且赋值
Shell变量测试及内容置换
变量置换方式 变量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= 新值 x 为空 x=$y
y= 新值 y 值不变 y值不变
x=${y:=新值} x= 新值 X= 新值 x=$y
y= 新值 y= 新值 y值不变
x=${y?新值} 新值输出到标准错误输出(屏幕) x 为空 x=$y
x=${y:?新值} 新值输出到标准错误输出 新值输出到标准错误输出 x=$y
Shell source命令:使环境变量配置文件强制生效
source 配置文件
忽略脚本文件的权限。该命令主要用于让重新配置的环境变量配置文件强制生效
Shell(主要的)环境变量配置文件及其分类
/etc/profile
-USER 变量:根据登录的用户给这个变量赋值(就是让 USER 变量的值是当前用户)。
-LOGNAME 变量:根据 USER 变量的值给这个变量赋值。
-MAIL 变量:根据登录的用户来定义用户的邮箱为 /var/spool/mail/ 用户名。
-PATH 变量:根据登录用户的 UID 是否为 0,判断 PATH 变量是否包含 /sbin、/usr/sbin 和 /usr/local/sbin 这三个系统命令目录。
-HOSTNAME 变量:根据主机名给这个变量赋值。
-HISTSIZE 变量:定义历史命令的保存条数。
-umask:定义 umask 默认权限。注意:/etc/profile 文件中的 umask 权限是在"有用户登录过程(输入了用户名和密码)"时才会生效的。
-调用 /etc/profile.d/*.sh文件,也就是调用 /etc/porfile.d/ 目录下所有以 .sh 结尾的文件
/etc/profile.d/*.sh
/etc/bashrc
~/.bash_profile
~/.bashrc
/etc/profile、/etc/profile_d/*.sh 和 /etc/bashrc 这三个环境变量配置文件会对所有的登录用户生效;
而 ~/.bash_profile 和 ~/.bashrc 这两个环境变量配置文件只会对当前用户生效(因为每个用户的家目录中都有这两个文件)
Shell登陆信息及修改方法详解
录 tty1~tty6 这 6 个本地终端时,会有几行的欢迎界面。这些欢迎信息是保存在哪里的?可以修改吗?当然可以修改,这些欢迎信息保存在 /etc/issue 文件中
/etc/issue支持的转义符
转义符 作 用
\d 显示当前系统日期
\s 显示操作系统名称
\1 显示登录的终端号,这个转义符比较常用
\m 显示硬件体系结构,如i386、i686等
\n 显示主机名
\o 显示域名
\r 显示内核版本
\t 显示当前系统时间
\u 显示当前登录用户的序列号