一、链接文件
1.1 软链接(符号链接)
ls -l 能看到类型为 链接文件 的都是 软连接
软连接类似于windows的快捷方式
创建软连接的方式:
ln -s 被链接的文件文件名 要生成的文件名
注意:
1.我们一般创建软连接时 最好使用绝对路径 否则一旦相对位置发生变化 链接就会失效。
2.如果被链接的文件位置发生变化,后者被删除了 链接也会消失。
1.2 硬链接
硬链接相当于给文件起了一个别名。
创建硬链接的方式:
ln 被链接的文件名 要生成的文件名
硬链接文件只是在操作系统中给文件起了一个别名,同一组的硬链接文件inode号相同
Linux系统是通过inode号来识别文件的
使用 ls -l 文件名 或者 stat 文件名 来查看文件的inode号
对于硬链接而言,删除一个名字,不会影响整个文件
只有把所有名字都删除,文件才真的被删除
修改一个文件,同一组的另外的名字访问文件也会发生变化
二、环境变量
2.1概念
环境变量就是保存系统启动相关和系统运行相关的一些值的变量。
使用 env 命令可以 查看 系统中已有的所有的环境变量。
使用 echo $环境变量名 就可以打印对应的环境变量的值。
2.2 常见的环境变量
//用户的家目录
HOME=/home/linux
//当前路径
PWD=/home/linux/....
//上一次所在路径
OLDPWD=/home/linux
//默认命令解析器
SHELL=/bin/bash
//可执行文件的路径
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
当执行命令或程序时,系统会在PATH保存的路径中,逐个的找可执行文件的路径,找到了就执行
找不到就报错,命令不存在
让自己的程序可以在任意路径下执行:
方式1:把自己的可执行文件放在PATH路径下的某一个路径下---需要sudo
方式2:把自己的可执行文件的路径添加到PATH中即可;
2.3 修改环境变量的方式
2.3.1 只对当前终端生效
export 环境变量=环境变量值 覆盖写
export 环境变量名=$环境变量名:要追加的值 追加写
例如:
export PS1=xxxx //覆盖写 // PS1是控制命令行提示符内容及配色的
export PATH=$PATH:/home/linux //追加写
生效范围:只对当前终端生效
生效方式:立即生效
2.3.2 对当前用户生效
用户在登陆后打开终端的过程中,会自动执行很多个脚本,其中一个是 ~/.bashrc
只需要将 声明环境变量的语句放在该脚本中 就会被自动执行
注意:每个用户在自己的家目录下都有一个 .bashrc 文件,
所以修改哪个用户的就对哪个用户生效 其他用户不受影响
生效范围:对当前用户生效
生效方式:重新打开终端生效 或者使用 source ~/.bashrc 立即生效
2.3.3 对系统的所有用户生效----一般不使用
系统开启的过程中,也会生成很多个脚本,其中一个就是 /etc/profile
只需要将声明 环境变量的语句放在该脚本中 就会被自动执行了
(系统启动时 自动执行该脚本1 就帮我们生命了环境变量)
生效范围:对系统中所有用户都生效
生效方式:重启系统生效 或者使用 source /etc/profile 立即生效
三、网络基础及相关命令
3.1 网络基础
3.1.1 ip 地址
IP地址:主机在网络中的一个编号,这个编号就是ip地址;
ip地址分类:ipv4(4字节32位)ipv6(16字节128位)
ipv4地址的表示方式:点分十进制“192.168.10.20”
1100 0000 1010 1000 0000 1010 0001 0100
ipv4地址的组成:由 网络号 和 主机号 组成
ipv4地址的分类:
网络号 主机号 规定最高位 范围 用单位
A 1字节 3字节 0 [0-127] 政府/大公司/学校
B 2字节 2字节 10 [128-191] 中等规模的公司
C 3字节 1字节 110 [192-223] 个人
192.168.1.255 广播地址
D 1110 [224-239] 组播
E 11110 [240-255] 未使用(实验室)
A:0.0.0.0 - 127.255.255.255
B:128.0.0.0-191.255.255.255
C:192.0.0.0-223.255.255.255
D:224.0.0.0-239.255.255.255
E:240.0.0.0-255.255.255.255
其中每个IP地址又可以通过路由器,下发局域网IP地址,每类IP地址都有专门划分子网的保留段。
3.1.2 子网掩码
由一堆连续的1 和 一堆连续的 0 组成的;
子网掩码用来和 ip 地址做 & 运算来获取网络号的;
两台主机的ip地址和子网掩码取 & 运算,得到的网络号相同,才能做局域网通信。
3.1.3 网关
网关是用来和外界进行通信的出口,一般同一局域网中的第一个ip地址就是 网关地址,给路由器使用的ip地址。
3.1.4 dns服务
域名解析服务
www.baidu.com --> 39.156.66.18
两个免费的域名解析服务器:
8.8.8.8 114.114.114.114
3.2 Ubuntu设置网络的方法
方法1:图形化界面设置
点击右上角图标--> 有线连接 --> 有线设置
将连接开关 关闭 后,再点击后面的设置图标
选择IPv4 --> 添加相关参数(IP地址、子网掩码、默认网关、DNS) --> 应用
然后重新打开连接开关
3.3 网络相关命令
查看网络信息的命令
linux -> ifconfig
win -> ipconfig
查看网络是否连通
ping
ping 192.168.50.206 //局域网
ping www.baidu.com //连接外网
出现
PING 192.168.60.97 (192.168.60.97) 56(84) bytes of data.
64 bytes from 192.168.60.97: icmp_seq=1 ttl=64 time=60.2 ms
64 bytes from 192.168.60.97: icmp_seq=2 ttl=64 time=2.40 ms
表示连通了
Ubuntu中如果网络服务器异常,可以按下面的流程操作一下:
sudo service network-manager stop 停止网络服务
sudo vi /etc/NetworkManager/NetworkManager.conf 打开配置文件
将managed=false 改成 managed=true 保存退出
su root 切换到root用户 执行下面的命令
rm /var/lib/NetworkManager/NetworkManager.state
exit 回到原用户
sudo service network-manager start 重新启动网络服务
shell
----------------------shell编程--------------------------
运维、测试的人员常用。 对大家的要求:简单的脚本得会写,复杂的脚本能看懂。
一、什么是shell?什么是shell命令?什么是shell脚本?
1.1 shell
shell是一个命令行解释器
(1)sh :(全称 Bourne Shell)是UNIX最初使用的 shell,
而且在每种 UNIX 上都可以使用。Bourne Shell 在 shell
编程方面相当优秀,但在处理与用户的交互方面做得不如
其他几种 shell。
(2)csh :是一种比 Bourne Shell更适合的变种 Shell,
它的语法与 C 语言很相似
(3)ksh :集合了 C Shell 和 Bourne Shell 的优点并且
和 Bourne Shell 完全兼容。
(4)bash :LinuxOS 默认的,它是 Bourne Shell 的扩展。
与 Bourne Shell 完全兼容,并且在 Bourne Shell 的基
础上增加了很多特性。可以提供命令补全,命令编辑和命
令历史等功能。它还包含了很多 C Shell 和 Korn Shell
中的优点,有灵活和强大的编辑接口,同时又很友好的用户界面
dash--bash的轻量版
使用 echo $SHELL 可以查看当前系统使用的命令行解释器
1.2 shell 命令
就是我们平时在终端使用的命令。
1.3 shell 脚本
shell脚本本身是一个 .sh 结尾的文件 , 里面都是命令的集合以及一些复杂的逻辑。
作用:批量的执行命令。
练习:
要求:写出上面操作需要执行的命令,把这些命令保存在文件中,截图:
脚本中使用 家目录 时,最好使用 $HOME 不要使用~
二、如何执行shell脚本
shell是一个解释型语言,无需编译,直接把脚本交给解释器执行即可。
shell脚本有三种执行方式:
./脚本名 执行时需要有执行权限(chmod u+x 脚本名)
在后台开一个终端(我们看不到)执行脚本,并把结果显示到当前终端
bash 脚本名 不需要执行权限
在后台开一个终端(我们看不到)执行脚本,并把结果显示到当前终端
source 脚本名 不需要执行权限
直接在当前终端执行
三、shell 中的变量
3.1 特点
shell中的变量不需要提前定义,直接使用即可
shell中的变量没有类型,默认都是字符串 没有整数、浮点数、字符之分
shell中的变量也要符合命名规范:
1、由数字,字母,下划线组成
2、不能以数字开头
3、不能和shell中的关键字冲突
4、尽量做到望文知意
一般情况下,shell中的变量多采用大写字母
shell中一行指令结束 无需加分号
3.2 引用变量的值
$变量名 或者 ${变量名}
注意不要写成 $(变量名) 这种用法叫命令置换符
3.3 清空变量的值
unset 变量名
#!/bin/bash
#此命令表示 执行改脚本时,默认的命令解析器为 /bin/bash
#shell中使用的#表示注释
V1=hello #注意:赋值等号前后不可加空格
echo V1 #V1
echo $V1 #hello
echo "----------------------------"
#echo 作用是将内容打印到终端 类似于C语言的printf
V2=1234
echo $V2 #1234
V3=$V1 #变量的赋值
echo V3=$V3 #V3=hello
echo $V3=V3 #hello=V3
echo "----------------------------"
# $变量名 和 ${变量名} 区别
V4=beijing
V5=$V4nihao # 将V4nihao当做变量名 但是没有这个变量名
echo $V5 # 就会输出空值
V6=${V4}nihao # 输出V4的值之后继续输出nihao
echo $V6
echo "----------------------------"
#如果赋值的字符中间有空格 必须加引号
V7=hello world #没加引号,将hello赋值给V7,把world当命令再执行,会报错
V8="hello world" #正确
echo $V8 # hello world
V9='hello world'
echo $V9 # hello world
echo "----------------------------"
#单引号和双引号的区别--单引号中不能引用其他变量的值
A1=hqyj
A2="${A1} nice"
echo $A2 #hqyj nice
A3='${A1} ok'
echo $A3 #${A3} ok
echo "----------------------------"
# 清空变量的值
unset A3
echo $A3 #空值
echo "----------------------------"
结果:
V1
hello
----------------------------
1234
V3=hello
hello=V3
----------------------------
beijingnihao
----------------------------
04test.sh: 行 28: world:未找到命令
hello world
hello world
----------------------------
hqyj nice
${A1} ok
----------------------------
----------------------------
shell中既可以使用自己定义的变量 也可以使用环境变量
eg:
使用两个变量 A B 分别来保存环境变量 PATH 和 HOME 的值
交换AB的值 并输出
#!/bin/bash
A=$PATH
B=$HOME
C=$A
A=$B
B=$C
echo $A
echo $B
结果:
/home/linux
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/linux/toolchain/gcc-7.5.0/bin
3.4 shell 中的位置变量
位置变量的作用类似于 C语言中的 main 函数的参数 argv
$0 脚本名 不同的执行方式下$0的值也不一样
./方式执行 $0 就是 ./脚本名
bash方式执行 $0 就是 脚本名
source 方式执行 $0 就是 bash
$1~$9 执行脚本时 命令行的所有参数(不包含脚本)
如果有超过9个参数 需要使用${} 引用值
例如:${27} ${123}
$@ 执行脚本时 显示 命令行的所有参数(不包含脚本名)
$* 执行脚本时 显示 命令行的所有参数(不包含脚本名)
$# 执行脚本时 显示 命令行的所有参数的个数(不包含脚本名)
$$ 执行脚本的进程号
$? 用来表示上一条命令是否执行成功 0 成功 1 失败
3.5 变量的作用域
如果不加任何修饰,变量的作用域,默认为全局
如果想定义局部变量,需要单独使用local关键字修饰
#!/bin/bash
#shell中函数的定义
function my_test()
{
V1="hello world"
echo $V1 #hello world
local V2="beijing"
echo $V2 #beijing
}
my_test #shell中的函数调用
echo $V1 #hello world
echo $V2 # 空
结果:
hello world
beijing
hello world
3.6 只读变量
shell中使用关键字 readonly 来修饰只读变量
#!bin/bash
V1=hello
echo $V1 #hello
V1=good #没有被readonly修饰的变量可以被修改
echo $V1 #good
readonly V2=nihao
V2=shanghai #报错 V2是只读变量
结果:
hello
good
07test.sh: 行 7: V2:只读变量
3.7 命令置换符
作用:将命令执行的结果,赋值给变量
``--注意:这个是反引号,键盘tab上面的按键(英文模式下)
$()
#!/bin/bash
LIST1=`ls`
echo $LIST1
LIST2=$(pwd)
echo $LIST2
结果:
01test.sh 02test.sh 03test.sh 04test.sh 05test.sh 06text.sh 07test.sh 08test.sh a.out file file1 hello.c link link1 test.sh
/home/linux/stage2/day3
四、shell 中的注释
shell中本质上只有单行注释 使用 # 来表示
如果需要多行注释,可以使用下面的方法:
此方法利用了重定向符的规则,如果脚本的注释内容有输入的指令,结果可能就会有问题 不建议使用
标准的注释方法就是 在要注释的内容前面加 #
:<<EOF
多行
注释
EOF
或者
:<<!
多行
注释
!
五、shell中字符串的相关操作
5.1 求字符串的长度 -- strlen
#!/bin/bash
S1="hello world"
echo ${#S1} #11
结果:
11
5.2 字符串拷贝 -- strcpy
对于shell来说,字符串拷贝的本质就是变量的重新赋值
#!/bin/bash
S1=hello
S2=world
echo S2=$S2
S2=$S1
echo S2=$S1
结果:
S2=world
S2=hello
5.3 字符串拼接 -- strcat
#!/bin/bash
S1=hello
S2=beijing
S1=${S1}${S2}
echo $S1 #hellobeijing
S3=good
S3="beijing"${S3}"nice"
echo $S3
S4=nihao
S5=ok
S4="${S4} ${S5}"
echo $S4
结果:
hellobeijing
beijinggoodnice
nihao ok
5.4 截取字符 -- strtok
#!/bin/bash
STRING="www.baidu.com"
# 0123456784321
#从第四个字符开始截取 截取到字符串结束
echo ${STRING:4} #baidu.com
echo "------------------------------------"
#从第四个开始截取 截取5个字符
echo ${STRING:4:5} #baidu
echo "------------------------------------"
#从倒数第六个开始截取 到字符串结束
echo ${STRING:0-6}
echo "------------------------------------"
#从倒数第六个开始截取 截取两个
echo ${STRING:0-6:2}
echo "------------------------------------"
#----上面四种比较常见,下面几种了解即可---------
STRING1="12345678987654321"
#从左到右 截取第一次出现 8 后面的内容
echo ${STRING1#*8} #987654321
echo "------------------------------------"
#从左到右 截取最后一次出现8 后面的内容
echo ${STRING1##*8} #7654321
echo "------------------------------------"
#从右向左 截取第一次出现8前面的内容
echo ${STRING1%8*} #123456789
echo "------------------------------------"
#从右向左 截取最后一次出现8前面的内容
echo ${STRING1%%8*} #1234567
echo "------------------------------------"
结果:
baidu.com
------------------------------------
baidu
------------------------------------
du.com
------------------------------------
du
------------------------------------
987654321
------------------------------------
7654321
------------------------------------
123456789
------------------------------------
1234567
------------------------------------
六、shell中的数组
shell中只有一维数组,使用()来表示
shell中的数组不用提前定义 可直接使用
shell中的数组元素也没有类型 默认都是字符串
#!/bin/bash
ARR1=(aa bb cc dd) #成员之间用空格隔开
#访问数组成员的方式
# ${数组名[下标]}
echo ${ARR1[0]} #aa
echo ${ARR1[1]} #bb
echo ${ARR1[2]} #cc
echo ${ARR1[3]} #dd
echo "------------------------------------"
#数组成员重新赋值
ARR1[0]=hello
echo ${ARR1[0]} #hello
echo "------------------------------------"
#访问数组所有成员
echo ${ARR1[@]}
echo ${ARR1[*]}
echo "------------------------------------"
#获取数组的个数 用#符号
echo ${#ARR1[@]}
echo ${#ARR1[*]}
echo "------------------------------------"
#数组成员的追加
ARR1=(${ARR1[@]} beijing shanghai)
echo ${ARR1[@]}
ARR1=(nihao ${ARR1[*]})
echo ${ARR1[@]}
echo "------------------------------------"
#不完全初始化
ARR2=([0]="hello" [3]="good")
echo ARR2[0]=${ARR2[0]} #hello
echo ARR2[1]=${ARR2[1]}
echo ARR2[2]=${ARR2[2]}
echo ARR2[3]=${ARR2[3]} #good
echo "------------------------------------"
结果:
aa
bb
cc
dd
------------------------------------
hello
------------------------------------
hello bb cc dd
hello bb cc dd
------------------------------------
4
4
------------------------------------
hello bb cc dd beijing shanghai
nihao hello bb cc dd beijing shanghai
------------------------------------
ARR2[0]=hello
ARR2[1]=
ARR2[2]=
ARR2[3]=good
------------------------------------