cos_shell-变量
Shell的概述
shell是一个命令解释器
shell的分类
Bourne shell :bourne shell 的主文件名为sh
shell的两种主要语法有Bourne 和C 两种,彼此不兼容。Bourne家族主要包括sh,ksh,Bash,psh,zsh;C家族主要包括cdh,tcsh
Bash: bash与sh兼容,现在的liunx就是使用bash为基本的shell
liunx支持的shell
1 | [ root@localhost ~ ] $ vi /etc/shells |
Shell脚本的执行方式
echo输出命令
1 | [ root@localhost ~ ] $ echo [ 选项 ] [ 输出内容 ] |
控制字符列表:
控制字符 | 作用 |
---|---|
\\ |
输出“\”本身 |
a |
输出警告音 |
b |
退格键,向左删除“b” |
c |
取消输出行末的换行符。 |
e |
ESCAPE键 |
f |
换页符 |
n |
换行符 |
r |
回车键 |
t |
制表符,也就是Tab键 |
v |
垂直指标符 |
0nnn |
按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数 |
xhh |
按照十六进制ASCII表输出字符,其中hh是两位进制数 |
示例:
1 | [ root@localhost ~ ] $ echo -e "abbc" |
颜色表:
30m | 黑色 |
---|---|
31m | 红色 |
32m | 绿色 |
33m | 黄色 |
34m | 蓝色 |
35m | 洋红 |
36m | 青色 |
37m | 白色 |
第一个脚本
1 | [ root@localhost sh ] $ cat > hello.sh |
脚本执行
1 | [ root@localhost sh ] $ chmod 755 hello.sh |
Bash的基本功能
历史命令与命令补全
- 历史命令:
1 | [ root@localhost ~ ] $ history [ 选项 ] [ 历史命令保存文件 ] |
- 历史命令的调用:
上,下键 调用以前的历史命令
!n 重复执行第n条历史命令
!! 重复执行上一条命令
“!字串” 重复执行最后一条以该字串开头的命令
命令与文件补全:
Tab
键自动补全命令命令别名与常用快捷键:
- 命令别名:
1
2
3
4[ root@localhost ~ ] $ alias 别名=“原命令”
//设定命令别名
[ root@localhost ~ ] $ alias --查询命令别名- 命令执行顺序:
>1. 第一顺位执行绝对路径或相对路径执行的命令 > >2. 第二顺位执行别名 > >3. 第三顺位执行bash的内部命令 >4. 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
- 让命令别名永久生效:
1
2
[ root@localhost ~ ] $ vi /root/.bashrc
//添加别名内容
- 删除命令别名:
1
[ root@localhost ~ ] $ unalias 命令别名
- 常用快捷键:如图1
![](/some森-onenote/Centos-教程/centos笔记图组/shell1.png)
输入输出重定向
- 标准输入输出:
设备 | 设备文件名 | 文件描述 | 类型 |
---|---|---|---|
键盘 | /dev/stdin |
0 | 标准输入 |
显示器 | /dev/sdtout |
1 | 标准输出 |
显示器 | /dev/sdterr |
2 | 标准错误输出 |
- 输出重定向:
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | 命令 >文件 |
以覆盖方式把命令的正确输出到指定的文件或设置中 |
标准输出重定向 | 命令 >>文件 |
以追加方式把命令的正确输出到指定的文件或设置中 |
标准错误输出重定向 | 错误命令 2>文件 |
以覆盖方式把命令的错误输出到指定的文件或设置中 |
标准错误输出重定向 | 错误命令 2>>文件 |
以追加方式把命令的错误输出到指定的文件或设置中 |
- 正确的输出与错误的输出同时保存:
符号 | 作用 |
---|---|
命令 >文件 2>&1 |
以覆盖方式把命令的正确输出和错误输出都保存到同一文件或设置中 |
命令 >>文件 2>&1 |
以追加方式把命令的正确输出和错误输出都保存到同一文件或设置中 |
命令 &>文件 |
以覆盖方式把命令的正确输出和错误输出都保存到同一文件或设置中 |
命令 &>>文件 |
以追加方式把命令的正确输出和错误输出都保存到同一文件或设置中 |
错误命令 >>文件1 2>>文件2 |
把正确的输出追加到文件1,错误的输出追加到文件2 |
- 输入重定向:
1 | [ root@localhost ~ ] $ wc [ 选项 ] 文件名 |
使用:
1
2[ root@localhost ~ ] $ 命令 <文件
//把文件作为命令的输入
多命令顺序执行与管道符
- 多命令执行顺序:
多命令执行符 | 格式 | 作用 |
---|---|---|
; |
命令1; 命令2 |
多个命令顺序执行,命令之间没有逻辑关系 |
&& |
命令1 && 命令2 |
”与“,当命令1正确执行,则命令2才会执行,反之,则命令2不会执行 |
|| |
命令1|| 命令2 |
”或“,当命令1执行不正确,则命令2执行,反之,则不会执行 |
示例:
1 | [ root@localhost ~ ] $ ls anaconda-ks.cfg && echo yes |
磁盘复制:
1 | [ root@localhost ~ ] $ dd if=输入文件 of=输出文件 bs=字节数 count=个数 |
示例:
1 | [ root@localhost ~ ] $ date; dd if=/dev/zer0 of=/root/testfile bs=1k count=100000; date |
管道符:
命令格式:
1
[ root@localhost ~ ] $ 命令1 | 命令2 命令1的正确输出作为命令2的操作对象
示例:
1
2
3[ root@localhost ~ ] $ ll -a /etc/ | more
[ root@localhost ~ ] $ netstat -an | grep "ESTABLISHED"
通配符与其他特殊符号
- 通配符:
通配符 | 作用 |
---|---|
? | 匹配任意一个字符 |
* | 匹配0个或任意多个任意字符 |
[ ] | 匹配中括号中任意一个字符。例:[ abc ], 可以是a或b或c |
[ - ] | 匹配中括号中任意一个字符,- 代表一个范围,例:[ a-z ],代表匹配a到z的任意一个字母 |
[ ^ ] | ”非“,表示匹配不是括号中的一个字符,例:[ ^0-9 ],代表匹配一个不是数字的字符 |
示例:
1 | [ root@localhost ~ ] $ rm -rf /* |
- 其他特殊符号:
符号 | 作用 |
---|---|
‘ ? ’ | 单引号中所有的特殊符号,都没有特殊含义(如:$ 和 ` ) |
”?“ | 双引号中除 $ 和 和 以外的特殊符号都没有特殊含义($:特殊变量值 :引用命令 :转义符) |
` ? ` | 反引号中内容是系统命令,在bash中与 $() 一致 |
$( ? ) | 与反引号一致,用来引用系统命令 |
# | 表示注释 |
$ | 用于调用变量的值,如 需要调用name的变量值则用 $name=***来表达 |
转义符,跟在之后的特殊符号不具有特殊含义,变为普通字符,如:$ 则只输出$本身符号,而不具有调用变量值的含义 |
Bash的变量
用户自定义变量
- 变量概述:
变量是计算机内存的单元,其中存放的值可以改变。当shell脚本需要保存一些信息时,把一个文件名或一个数值存放在一个变量中。
每一个变量都会有一个名字,可以很方便保存有用的信息。
- 变量设置规则:
变量名可以由数字与字母和下划线组成,但不能以数字开头。如 变量名为”2name“则是错误
在bash中,变量的默认类型都是字符串类型,如要进行数值运算,则必修改指定变量类型为数值类型
变量用等号连接值,等号左右两侧不能有空格
变量的值如果有空格,则需使用单引号或双引号包括
在变量值中,可以使用”“转义符
如果需要增加变量的值,那么可以进行变量值的叠加。但需要用双引号包括”$变量名“或${ 变量名}。
如果是把命令的结果作为变量值,则需要使用反引号或$()包括命令
环境变量名建议大写,以便于区分
- 变量分类:
用户自定义变量
环境变量:主要保存的是和系统操作环境相关的数据
位置参数变量:主要用来向脚本中传递参数或数据,变量名不能自定义,变量作用是固定的
预定义变量:是bash中已经定义号的变量,变量名不能自定义,变量作用也是固定的
本地变量:
- 变量定义:
1
2
3
4
5
6
7
8
9
10[ root@localhost ~ ] $ name="yi yang"
--变量叠加:
[ root@localhost ~ ] $ aa=123
[ root@localhost ~ ] $ aa="$aa"456
[ root@localhost ~ ] $ aa=${aa}789
结果:123456789- 变量调用:
1
[ root@localhost ~ ] $ echo $name
- 变量查看:
1
[ root@localhost ~ ] $ set
- 变量删除:
1
[ root@localhost ~ ] $ unser 变量名
环境变量:(路径:~/.bash_profile)
环境变量概述:
用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。
设置环境变量:
命令详细:
1
2
3
4
5
6[ root@localhost ~ ] $ export 变量名=变量值
//申明变量
[ root@localhost ~ ] $ env //查询变量
[ root@localhost ~ ] $ unset 变量名 删除变量
系统常见环境变量:
PATH:系统查找命令路径
1
[ root@localhost ~ ] $ echo $PATH
PATH变量叠加:
1
[ root@localhost ~ ] $ PATH="$PATH":/root/sh
PSI:定义系统提示符的变量
提示符变量 |
---|
\d : 显示日期,格式”星期 月 日“ |
\h : 显示简写主机名,如默认主机名”localhost“ |
\t : 显示24小时制时间,格式”HH:MM:SS“ |
\T : 显示12小时制时间,格式”星期 月 日“ |
\A : 显示24小时制时间,格式”HH:MM“ |
\u : 显示当前用户名 |
\w : 显示当前所在目录的完整名称 |
\W : 显示当前所在目录的最后一个目录 |
\# : 执行的第几个命令 |
\$ : 提示符,如果是root用户会显示提示符为”#“,如果是普通用户会显示提示符为”$“ |
示例:
1 | [ root@localhost ~ ] $ PSI='[u@t w]$' |
位置参数变量
位置参数变量 | 作用 |
---|---|
$n | n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}. |
$* | 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
示例<1>:#!/bin/bash
1 | num1=$1 |
1 | 示例<2>:#!/bin/bash |
1 | 示例<3> :$* 与 $@ 的区别 |
预定义定量
预定义定量 | 作用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
示例:<如图>
- 接收键盘输入:
1 | [ root@localhost ~ ] $ read [ 选项 ] 变量名 |
示例<如图>
Bash的运算符
数值运算与运算符
1 | [ root@localhost ~ ] $ declare [ +或- ] [ 选项 ] 变量名 |
- 方法一:
declare
1 | [ root@localhost ~ ] $ aa=11 --给变量aa赋值 |
- 方法二:
expr
或let
数值运算工具
1 | [ root@localhost ~ ] $ aa=11 --给变量aa赋值 |
- 方法三:
$((运算式)) 或$[ 运算式 ]
1 | [ root@localhost ~ ] $ aa=11 给变量aa赋值 |
数字越大运算优先级越高
优先级 | 运算符 | 说明 |
---|---|---|
13 | - ,+ |
单目负,单目正 |
12 | ! ,~ |
逻辑非、按位取反或补码 |
11 | * ,/ ,% |
乘、除、取模 |
10 | + ,- |
加、减 |
9 | << ,>> |
按位左移、按位右移 |
8 | <= ,>= ,< ,> |
小于或等于、大于或等于、小于、大于 |
7 | == ,!= |
等于、不等于 |
6 | & |
按位“与” |
5 | ^ |
按位异“或” |
4 | | |
按位“或” |
3 | && |
逻辑“与” |
2 | || |
逻辑“或” |
1 | = ,+= ,-= ,*= ,/= ,%= ,&= ,……= ,|= ,<<= ,>>= |
赋值、运算且赋值 |
示例:
1 | [ root@localhost ~ ] $ aa=$(( (11+3)*3/2 )) |
变量测试与内容替换
变量置换方式 | 变量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 |
- 示例一:测试
x=${ y-新值 }
1 | [ root@localhost ~ ] $ unset y --删除变量 |
环境变量配置文件
环境变量配置文件简介
环境变量
定义每个用户的操作环境
环境变量配置文件中主要是定义对系统操作环境生效的系统默认环境变量,如PATH等;PATH、HISTSIZE、PS1、HOSTNAME等环境变量写入对应的环境变量配置文件;
常见的环境变量
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
注:放在家目录(3,4)下的环境变量配置文件,只会对当前用户起作用;在/etc下的环境变量所有的用户都起作用;
- source命令:
1 | [ root@localhost ~ ] $ source 配置文件 |
- 环境变量配置文件调用顺序:
/etc/profile的作用:
USER变量:
LOGNAME变量:
MAIL变量:
PATH变量:
HOSTNAME变量:
HISTSIZE变量:
umask:
调用/etc/profile.d/*.sh文件
umask #查看系统默认权限
文件最高权限为666
目录最好权限为777
权限不能使用数字进行换算,而必须使用字母;使用的是最高权限丢点默认的权限;
Eg:当前默认权限为022,那么创建的文件权限就是最高权限减去默认权限:wr-wr-wr- 减去 —-w–w- 那么创建的文件权限默认为wr–r–r-
Umask定义的权限,是系统默认权限中准备丢弃的权限如022,也就是—-w—w-
~/.bash_profile的作用:
调用了~/.bashrc 文件
在PATH变量后面加入了”:$HOME/bin”这个目录
~/.bashrc的作用:
定义默认别名
调用/etc/bashrc
/etc/bashrc的作用:
PS1 变量
umask
PATH变量
调用/etc/profile.d/*.sh文件
其他配置文件和登录信息
注销时生效的环境变量配置文件:
- ~/.bash_logout
其他配置文件:
- ~/bash_history
shell登录信息:
转义符 | 作用 |
---|---|
d | 显示当前系统日期 |
s | 显示操作系统名称 |
l | 显示登录的终端号(常用) |
m | 显示硬件体系结构,如i386等 |
n | 显示主机名 |
o | 显示域名 |
r | 显示内核版本 |
t | 显示当前系统时间 |
u | 显示当前登录用户的系列号 |
远程终端欢迎信息:/etc/issue.net
转义符在/etc/issue.net文件中不能使用
是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner/etc/issue.net” 才能显示 (记得重启SSH服务)
登录之后欢迎信息:/etc/motd
- 不管是本地登录还是远程登录,都可以显示此欢迎信息