https://github.com/blackplusy/0822python-
1.Linux的目录结构
linux下一切皆为文件
/ 根目录 存放linux中所有文件
/bin 存放普通用户命令的位置
/boot 系统启动时需要的引导文件
/dev 存放系统硬件的位置
/etc 存放系统配置文件
/home 普通用户的家目录所在目录(当我们创建用户时候,默认会在/home里面创建一个和用户同名的目录作为该用户的家目录[用户登录时候默认所在的目录],即~)
/root 管理员的家目录/lib 存放系统库文件的位置
/mnt 系统默认挂载点
/opt 普通用户操作所在目录
/proc 存放系统当前运行信息的位置
/sbin 存放管理员命令的位置
/tmp 存放系统临时文件的位置
/var 存放系统运行信息(日志文件)
2.vim警告信息处理
在用vim打开一个文件时,其会产生一个cmd.swap文件,用于保存数据,当文件非正常关闭时,可用此文件来恢复,当正常关闭时,此文件会被删除,非正常关闭时,不会被删除,所以提示存在.swap文件。
解决方法如下:
方法1、此时你可以恢复文件:
vim -r nginx.conf
恢复以后把.swap文件删掉,在打开时就不会用提示良,注意.swap文件是个隐藏文件。可用:la查看。以.开头的是隐藏文件。
方法2、ls -a 查询隐藏文件
将后缀名为.swp的文件删除
rm -f .nginx.conf.swp
再次编辑文件不在出现提示警告!
1.单引号&双引号
单引号属于强引用,如需实现传参数,需要给参数再加一个单引号
双引号属于弱引用,双引号内的参数仍为参数,但弱存在$字符,则需要转义
由下面的例子不难看出,双引号是不会屏蔽对变量和某些特殊符号的转义的,而单引号里的所有内容都会原封不对的输出
,而单引号里再用单引号将变量引起来,变量就又可以正常的显示,有点像数学里的负负为正。
#!/bin/bash
for ((site=00;site<100;site++))
do
echo '<VirtualHost *:80>'
echo ' ServerAdmin test@361way.com '
echo ' DocumentRoot "d:/wwwroot/group/www.test'${site}'.com" '
echo ' ServerName www.test'${site}'.com'
done
shell中单引号、双引号和两个双引号的区别,看下面的例子:
[root@test] a=55
[root@test] echo $a
55
[root@test] echo '$a'
$a
[root@test] echo ''$a'' #注意此处是两个单引不是一个双引
55
2.bash&dash
#!/bin/sh 与 #!/bin/bash别代表了dash 与 bash。dash 是Debian Linux 发行版的shell,然而许多Debian Linux发行版将bash shell用作普通用户登录。一个很奇怪的问题:Ubuntu linux发行版将bash shell用作默认的交互shell,但将dash shell用作默认的/bin/sh。
2.2. for (( i=0; i < $1; i++ )); do done
2.bash支持这种类似C语言的循环,然而dash并不支持。dash会提示:Syntax error: Bad for loop variable
2.3.显示环境变量:dash 通过set,bash通过env。
2.4.let命令:只能用于bash,sh并不支持。
let 用于bash中执行数学运算,与expr类似。
2.5.有如下五种实现变量自加的运算,其中后三种只能在bash中使用
8 # A=$(($A+1))
9 # A=`expr $1 + 1`
10 # let A+=1 just suit in bash
11 # ((A++)) just suit in bash
12 # A=$[$A+1] just suit in bash
2.6.RANDOW 变量只支持bash,不支持dash
用这个环境变量对26取模即可。
如果想得到1--68范围内的数 : $(($RANDOM%68+1 ))
如果想得到6--87范围内的数 : $(($RANDOM%82+6 ))
3.变量
变量名字和变量值都是自定义的,用户可以进行控制修改
a1.命名规则
变量名可以有字母、数字、下划线组成,必须字母或下划线开头
变量名产读不能超过255
变量名在有效范围必须唯一
在脚本中,某人类型都是字符串
a2.变量存储类型
字符串类型,赋值时候单、双引号都可以
整型
浮点型
日期型
a3.变量定义
变量名=变量值
注意:等号左右不能有空格
a=10
b=20
c='heygor'
b.变量的调用
变量的调用通常作为输出,在变量名字前面增加$,进行打印即可
a=20
echo $a
a='heygor'
echo $a
d.变量的查看
可以查询当前系统运行的所有变量,包括系统变量和用户变量
set
e.变量的删除
unset x 注意:unset并不是删除变量里面的值,而是删除变量,变量名前面不需要加$
unset a
6.定义变量
定义变量通常2种方式
a.系统变量
系统变量可以用于定义shell的运行环境,环境变量可以在配置文件中进行定义和修改,也可以在命令行中设置,但是在命令行中设置重启终端后就会失效,最好在配置文件中进行修改(/etc/profile;~/.bashrc;~/.bash_profile),将环境变量放在配置文件中,每次登陆时后这些变量进行初始化
在.bashrc中最后一行添加 date | awk -F " " '{print $2,$3}',打开新终端后,直接显示日期
b.本地变量
在用户当前的shell生存其脚本使用
测试:打开终端设置变量输出,打开另外一个终端,显示变量输出
7.变量的赋值
1.直接赋值
等号左侧为变量名字,右侧为变量的值
a=20
a='heygor'
2.间接赋值
`` 反斜线代表先执行斜线中命令,然后把执行结果赋予变量
name=`hostname`
echo $name
ip=`ifconfig |grep inet`
echo $ip
3.交互赋值
read命令可以接受间哦按输入,并且赋值给变量
read -p "your name is : " username
echo $username
7.变量的位置参数进行赋值
通常脚本后面跟的第一个参数为$1,第二个参数为$2,以此类推
修改vim day-05.sh
findpath="$1"
find $findpath -name day-05.sh
执行
./day06 /home/heygor
修改vim day-06.sh
echo "第一个参数是 $1"
echo "第二个参数是 $2"
echo "第三个参数是 $3"
8.变量的运算
a.通过let方式
a=100
b=30
let c=a+b
echo $c
b.通过$()方式
a=20
b=30
c=$((a+b))
c.通过``方式
``先执行内部命令
now=`date | awk -F " " '{print $5}'`
echo $now
4.RANDOM
4.1.获取随机数字
[root@sftp01 test]# echo $RANDOM
28411
[root@sftp01 test]# echo $RANDOM
6371
[root@sftp01 test]# echo $RANDOM
1938
4.2.获取随机字符串
zelin@zelin-HP-EliteBook-8440p:/usr/bin$ echo $RANDOM | md5sum
5a39ed59b2f80ffcfa1409d945de8d39 -
zelin@zelin-HP-EliteBook-8440p:/usr/bin$ echo $RANDOM | md5sum
bf2c9e78f9548c61714db45f04fa01e0 -
4.3.获取范围内的随机值
#获取小于8的随机值(0-7)
zelin@zelin-HP-EliteBook-8440p:/usr/bin$ echo $(($RANDOM%8))
6
#获取3到10的随机值(3-(3+8-1))
zelin@zelin-HP-EliteBook-8440p:/usr/bin$ echo $(($RANDOM%8+3))
7
9.条件判断
shell编程中test命令,可以通过man test查看条件判断语法
条件判断在脚本中以if关键字开头fi关键字结尾,test等价与[]
a.单分支
if [ 条件 ];then
执行语句
fi
b.双分支
if [ 条件 ];then
执行语句
eles
执行语句
fi
c.多分支
if [ 条件 ];then
执行语句
elif [条件];then
执行语句
...
else
执行语句
fi
d.条件判断常见参数
-f 是否存在(文件)
test -f /etc/passwd
如果条件成立,返回码是$?=0
[ -f /etc/passwd ]
[ -f /etc ]
-e 不管是文件还是目录存在条件就成立
-n 字符串为非空就是成立
-z 字符床长度为0就成里
字符串的对比 = !=,不能用于数值大小的判断
-eq 等于
-ne 不等于
-lt 小于
-gt 大于
-gte大于等于
-lte 小于等于
逻辑判断符号
-a and(逻辑与) 同时满足条件
-o or(逻辑或) 满足一个条件即可
zelin@zelin-HP-EliteBook-8440p:/opt$ test 1 -eq 1
zelin@zelin-HP-EliteBook-8440p:/opt$ echo $?
0
2.2文件/目录判断
-f 是否存在(文件)
-e 不管是文件还是目录存在条件就成立
zelin@zelin-HP-EliteBook-8440p:/opt$ ls
for.sh python1.0 python.py shell.sh while.sh yechao
zelin@zelin-HP-EliteBook-8440p:/opt$ test -f for.sh
zelin@zelin-HP-EliteBook-8440p:/opt$ echo $?
0
1.3字符串判断
-n 字符串为非空就是成立
-z 字符串长度为0就成立
=字符串相同, !=字符串不相同(没有空格)不能用于数值大小的判断
zelin@zelin-HP-EliteBook-8440p:/opt$ test "aa" != "bb"
zelin@zelin-HP-EliteBook-8440p:/opt$ echo $?
0
#read -p "your name is " user
#echo $user
#if [ $user='heygor' ];then
# echo 'creazy!!!!'
#fi
if [ -f /etc/passwd1 ];then
echo 'file exxists!'
else
echo 'mu zhao dao'
fi
ls /etc/dadsadsads
if [ $? = "0" ];then
echo 'its your hostname'
else
echo 'WTF'
fi
10.循环
a.for循环
for循环就是遍历,访问序列中每一个元素
for i in 1 2 3 4
do
echo "no.$i"
done
echo "finished"
for i in `seq 10`
do
useradd usera$i
done
for ((i=1;i<=10;i++))
do
sudo userdel -r heyor$i
done
判断局域网中哪些IP可以用,哪些不可以用(写脚本)
b.while循环
while 条件
do
执行语句
done
while TRUE
do
执行语句
done
猜数字
rannum=$(($RANDOM%10)) #产生一个随机数
guest=100 #设置变量
echo $rannum #提示
while [ "$guest" -ne "$rannum" ]
do
read -p "guset num: " guest
done
echo "number is $rannum"
需求:每次提示大了或者小了
1.awk
文本的行处理工具
awk options file
查看ip地址
ifconfig ens33 |grep 255 |awk -F ":" '{print $2}'|awk -F " " '{print $1}'
awk -F ":" '{print $1}' /etc/passwd 打印文件的第一列
awk -F ":" '{print $1,$6}' /etc/passwd 打印文件的第一列和第六列
awk -F ":" '{print $1":"$6}' /etc/passwd打印文件第一列和第六列,用冒号分割
$1,$2......$N 表示第几列
awk -F ":" '{print $1,$6}' /etc/passwd
$0 表示一整行
awk -F ":" '{print $0}' /etc/passwd
$NF 表示最后一列
awk -F ":" '{print $NF}' /etc/passwd
NF 标识每行有多少列
head -1 /etc/passwd |awk -F ":" '{print NF}'
NR 标识当前行号
head -10 /etc/passwd |awk -F ":" '{print NR,$1}'
awk的关系操作符
== 等于
!= 不等于
>= 大于等于
<= 小于等于
< 小于
> 大于
awk的逻辑操作符
&& 逻辑与 真&&真==>真
|| 逻辑或 假||假==>假
! 逻辑非
打印行号
awk -F ":" '{print NR}' /etc/passwd
打印第8行
awk -F ":" 'NR==8{print;exit}' /etc/passwd
打印字段数(列数)大于4的行
awk -F ":" 'NF>4{print}' /etc/passwd
打印第5行到第10行
awk -F ":" 'NR>=5&&NR<=10{print NR,$0}' /etc/passwd
打印UID在30-100范围内的用户名
awk -F ":" '$3>=30&&$3<=100{print $1,$3}' /etc/passwd
awk -F "分隔符" 'BEGIN{ 处理文件前执行的代码块 }{ 处理文件过程中执行的 }END{ 处理文件后执行的代码 }'
输出顶部增加' begin '
输出最后增加' finish '
//
awk -F ":" 'BEGIN{ print "begin yeah!" }{ print $1 }END{print "finish!!!"}' passwd
注意:如果内容太多,可以通过 |more来进行查看
打印文件最后一行的最后一列
tail -1 passwd |awk -F ":" '{print $NF}'
awk -F ":" 'END{ print $NF }' passwd
打印字段数大于4的总行数
awk -F ":" 'NF>4{print}' /etc/passwd |wc -l
awk -F ":" 'BEGIN{ count=0 }NF>4{ count++ }END{ print count }' passwd
把AWK代码写入独立文件中执行
01.awk
BEGIN{
FS=":"
count=0
}
{
if( NF>4 ){
count++
}
}
END{
print count
}
执行时候使用 awk -f 01.awk passwd
12.sed
字段编辑和字段替换
删除指令 d 在查看时候屏蔽某些信息
删除所有行 sed -e 'd' mypass
删除第一行 sed -e '1d' mypass
删除1到3行 sed -e '1,3d' mypass
删除第1行和第3行 sed -e '1d;3d' mypass
删除包含root关键字的行 sed -e '/root/d' mypass
删除daemon开头的所有行 sed -e '/^daemon/d' mypass
删除bash结尾的所有行 sed -e '/bash$/d' mypass
删除所有空行 sed -e '/^$/d' mypass
删除所有以#开头的行 sed -e '/^#/d' mypass
打印所有行
sed -n -e '' mypass
sed -n -e 'p' mypass
打印第一行和第三行
sed -n -e '1p;3p' mypass
匹配管理员开的行打印
sed -n -e '/^root/p' mypass
匹配以nologin结尾的进行打印
sed -n -e '/nologin$/p' mypass
替换命令,显示、打印时候替换
每行搜到的第一个root关键字替换为admin
sed -e 's/root/admin/' mypass
每行找到所有n关键字替换为admin
sed -e 's/n/admin/g' mypass
只替换2-10行:为-
sed -e '2,10s/:/-/g' mypass
把结果保存到源文件中
sed -i '/^root/d' mypass
使用域进行定位
echo "28-08-2018"
echo "28-08-2018" |awk -F "-" '{print $3"-"$2"-"$1}'
echo "28-08-2018" |sed -r 's/(..)-(..)-(....)/\3-\1-\2/'
echo "come on,baby" |sed -r 's/(.*),(.*)/\2,\1/'
删除每行的第二个字符
cat test |sed -r 's/(.)(.)(.*)/\1\3/'
删除最后一个字符
echo "can you see me?" |sed -r 's/(.*)(.)/\1/'
删除倒数第二个字符
echo "can you see me?" |sed -r 's/(.*)(.)(.)/\1\3/'