查看Linux中默认支持的shell类型:
/etc/shells
echo 输出命令
-e 支持反斜线控制的字符转换
控制字符(需要加引号)
\\ | 输出\本身 |
\a | 输出警告音 |
\b | 退格键,向左删除 |
\c | 取消输出末行的换行符,和-n一致 |
\e | ESCAPE键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车键 |
\t | 制表符,Tab键 |
\v | 垂直制表符 |
\0 | 按八进制ASCII码输出字符,其中0为数字 |
\x | 按十六进制ASCII码输出字符 |
如:echo -e "a\tb\tc\nd\ne\nf\n"
echo -e "\e[1;31m abcdefgh\e[0m" 输出颜色
#30m=黑色; 31m=红色; 32m=绿色; 33m=黄色
#34m=蓝色; 35m=粉红; 36m=青色; 37m=白色
脚本执行的方式:
- 相对路径或绝对路径执行(需要执行权限):./hello.sh /home/t/hello.sh
- 通过bash调用(只需要读权限):bash hello.sh
Windows下写的shell脚本无法在Linux执行:
是因为windwos下的回车符是^M$,而Linux的回车符是$
rpm -q dos2unix #查看是否安装dos2unix
yum install -y dos2unix
dos2unix filename
#反过来unix2dos可以把Linux下shell脚本转换为windows的哦
history 查看历史命令
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件~/.bash_history
alias 查询命令别名
alias 别名=“原命令”
unalias 删除别名
/root/.bashrc 使别名永久生效
命令执行顺序
- 执行用绝对路径或相对路径执行的命令
- 执行别名
- 执行bash内部命令
- 执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
bash常用快捷键
ctrl + A | 把光标移动到命令行的开头 |
crol+ e | 把光标移动到命令行结尾 |
ctrl + c | 强制更改强制终止当前命令 |
ctrl + l | 清屏,相当于clear |
ctrl - u | 删除或剪切光标之前的内容 |
ctrl + K | 删除或剪切光标之后的内容 |
ctrl + y | 粘贴Ctrl+u或Ctrl+k剪切的内容 |
ctrl + r | 在历史命令中搜索 |
ctrl + d | 退出当前终端 |
ctrl + z | 暂停,并放入后台 |
ctrl + s | 暂停屏幕输出 |
ctrl + q | 恢复屏幕输出 |
输出重定向
标准输出重定向 | 命令>文件 | 以覆盖的方式,把命令的正确输出到指定文件或设备中 |
命令>>文件 | 以追加的方式,把命令的错误输出到指定的文件或设备中 | |
标准错误输出重定向 | 错误命令 2>文件 | 以覆盖的方式,把命令的错误输出到指定文件或设备中 |
错误命令 2>文件 | 以追加的方式,把命令的错误输出到指定的文件或设备中 | |
正确输出和错误输出同时保存 | 命令>文件2>&1 | 以覆盖的方式,把正确输出和错误输出都保存在同一文件 |
命令>>文件2>&1 | 以追加的方式,把正确输出和错误输出都保存在同一文件 | |
命令&>文件 | 以覆盖的方式,把正确输出和错误输出都保存在同一文件 | |
命令&>>文件 | 以追加的方式,把正确输出和错误输出都保存在同一文件 | |
命令>>文件1 2>>文件2 | 把正确的输出追加到文件1中,把错误的输出追加到文件2中 |
多命令顺序执行
; | 命令1;命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令1&&命令2 | 逻辑与。当命令1正确执行,则命令2才会执行 |
|| | 命令1||命令2 | 逻辑或。当命令1执行错误,则命令2才会执行 |
例:命令 && echo yes || echo no
命令1 | 命令2 管道符(命令1的正确输出作为命令2的操作对象)
例:more /etc/passwd | grep "root"
通配符
? | 匹配一个任意字符 |
* | 匹配0个或多个任意字符,也可以匹配任何内容 |
[ ] | 匹配中括号中任意一个字符 |
[ - ] | 匹配中括号中任意一个字符,- 代表一个范围。 |
[ ^ ] | 逻辑非,表示匹配不是中括号内的一个字符。如:[^0-9]代表匹配一个非数字字符 |
Bash中其他特殊符号
‘’ | 在单引号中所有的特殊符号如$和`(反引号)都没有特殊含义 |
“” | 在双引号中特殊符号都没有特殊含义,但$、`、\除外,拥有调用变量的值、引用命令和转义符的特殊含义 |
$() | 和`(反引号)作用一样。括起来的内容是系统命令,在bash中会先执行它 |
# | 在shell脚本中,#代表注释 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name得到变量的值 |
\ | 转义符,在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出$,而不当变量引用 |
变量是计算机内存的单元,其中存放的值可以改变。当shell脚本需要保存一些信息时,如一个文件名或 是一个数字,就把他存放在一个变量中。每个变量有一个命令,所以就很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用户保存暂时信息
变量设置规则
- 变量名称可以由字母、数字和下划线组成。但是不能以数字开头。
- 在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型
- 变量用等号连接值,等号左右两侧不能有空格
- 变量的值如果有空格,需要使用单引号或双引号包括
- 在变量的值中,可以使用 \ 转义符
- 如果需要增加变量的值,那么可以进行变量值叠加啊。不过变量需要用双引号包含$变量名或用$变量名包含
- 如果是把命令的结果 作为变量值赋予变量,则需要使用反引号或$()包含命令
- 环境变量名建议大写,便于区分
变量分类
- 用户自定义变量
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据 的,变量名不能自定义,变量的作用是固定的
- 预定义变量:是bash中已经定义好的变量。变量名不能自定义,变量的作用也是固定的
本地变量叠加
abc="blog" #定义变量
abc="$abc"int6
abc=${abc}cn
[[email protected] ~]# echo $abc #变量调用
blogint6cn
set #变量查看
unset abc #变量删除
环境变量:用户自定义变量只在当前shell中生效,而环境变量会在当前shell和这个shell的所有子shell中生效。如果把环境变量写入相应配置文件,那么这个环境变量就会在所有shell中生效
设置环境变量
export 变量名=变量值 #申明环境变量
env #查询变量
unset 变量名 #删除变量
系统常见环境变量
PATH:系统查找命令的路径
PATH="$PATH":/home/test/hello.sh
PS1:定义系统提示符的变量
\d:显示日期,格式 星期 月 日
\h:显示主机名
\t:显示24小时制时间
\T:显示12小时制时间
\A:显示24小时制时间,格式 HH:MM
\u:显示当前用户名
\w:显示当前所在目录的完整路径
\W:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符。Root用户为#,普通用户为$
位置参数变量
$n | n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如$[10] |
$* | 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 |
[email protected] | 这个变量也代表命令行中所有的参数,不过[email protected]把每个参数区分对待 |
$# | 这个变量代表命令行中所有的参数的个数 |
例:[[email protected] ~ ]#vim calc.sh
#!/bin/bash
num1=$1
num2=$2
num3=$3
sum=$(($num1+num2+num3))
echo $sum
[[email protected] ~ ]#./calc.sh 1 2 3
6
$*与[email protected]的区别例子:
[[email protected] ~ ]#vim test.sh
#!/bin/bash
for x in "$*"
do
echo $x
done
for y in "[email protected]"
do
echo $y
done
[[email protected] ~ ]#./test.sh 11 22 33 44
11 22 33 44
11
22
33
44
预定义变量
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体哪个数,由命令来决定),则证明上一个命令执行错误 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
例:[[email protected] a ]#ls -l
总用量 0
[[email protected] a ]#echo $?
0
[[email protected] a ]#error -l
bash: error: 未找到命令
[[email protected] a ]#echo $?
127
例2:[[email protected] ~ ]#vim test.sh
#!/bin/bash
echo ‘当前进程号是‘ $$
echo abcd &
echo ‘当前进程号是‘ $!
[[email protected] ~ ]#./test.sh
当前进程号是 2917
当前进程号是 2918
abcd
read 接收键盘输入
-p “提示信息” 在等待read输入时,输出提示信息
-t 秒数 read命令会一直等待用户输入,此选项指定等待时间
-n 字符数 read命令只接受制定的字符数。就会执行
-s 隐藏输入的数据,用于机密信息输入
例:#!/bin/bash
read -t 30 -p "请输入用户名:" id
echo "输入的是$id"
read -s -p "请输入密码" password
echo -e "\n"
read -n 1 -p "请输入性别[男/女]" gender
echo -e "\n"
echo "输入的是$gender"
[[email protected] ~ ]#./test.sh
请输入用户名:root
输入的是root
请输入密码:
请输入性别[男/女]:男
输入的是男
数值运算与运算符
declare [+/-][选项] 变量名
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(integer)
-x: 将变量生命为环境变量
-p: 显示指定变量的被声明的类型
例1:[[email protected] ~ ]#aa=11
[[email protected] ~ ]#bb=22
[[email protected] ~ ]#cc=$aa+$bb
[[email protected] ~ ]#echo $cc
11+22
[[email protected] ~ ]#declare -i cc=$aa+$bb
[[email protected] ~ ]#echo $cc
33
例2:expr或let数值运算
[[email protected] ~]# dd=$(expr $aa + $bb)
[[email protected] ~]# echo $dd
33
例3:$((运算式)) 或 $[运算式]
[[email protected] ~]# ee=$(($aa+$bb))
[[email protected] ~]# echo $ee
33
运算符
优先级 | 运算符 | 说明 |
13 | -,+ | 单目负,单目正 |
12 | !,~ | 逻辑非,按位取反或补码 |
11 | *,/,% | 乘,除,取模 |
10 | +,- | 加,减 |
9 | <<, >> | 按位左移,按位右移 |
8 | <= , >= , < , > | 小于或等于,大于或等于,小于,大于 |
7 | == , != | 等于,不等于 |
6 | & | 按位与 |
5 | ^ | 按位异或 |
4 | | | 按为或 |
3 | && | 逻辑与 |
2 | || | 逻辑或 |
1 | =,+=,- =,*=,/=,%=,&=,
^=, |=,<<=,>>= |
赋值、运算并赋值 |
aa=$((14%3)) #14不能被3整除,余数是2
aa=$((1&&0)) #逻辑与运算只有与的两边都是1,与的结果才是1
aa=$(((66+3)*3/2))#小括号可以调整运算优先级
环境变量配置文件:
source 配置文件
或
. 配置文件
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量
环境变量配置文件
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
/etc/profile的作用
user变量
LOGNAME变量
MAIL变量
PATH变量
HOSTNAME变量
HISTSIZE变量
umask
调用/etc/profile.d/*.sh
~/.bash_profile的作用
调用~/.bashrc文件
在PATH变量后面加入“$HOME/bin”这个目录
注销时生效的环境变量配置文件
~/.bash_logout
其他配置文件
~/.bash_history
shell登录信息
本地终端欢迎信息:/etc/issue
转义符 | 作用 |
\d | 显示当前系统日期 |
\s | 显示操作系统名称 |
\l | 显示 登陆的终端 |
\m | 显示硬件体系结构 |
\n | 显示主机名 |
\o | 显示域名 |
\r | 显示内核版本 |
\t | 显示当前系统时间 |
\u | 显示当前登录用户的序列号 |
远程终端欢迎信息:/etc/issue.net
转移符在/etc/issue.net文件中不能使用
是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入Banner /etc/issue.net行才能显示(需要重启ssh服务)
登陆后显示欢迎信息 /etc/motd
不管是本地登录,还是远程登录,都可以显示欢迎信息