云计算实战:SHELL编程(2)_千峰 云计算 shell能做什么 自动化批量系统初始化程序

case
case 语句是 shell 中流控制的第二种方式,语法如下:
case $word in
pattern1)
list1
;;
pattern2)
list2
;;
patternN)
listN
;;
)
list

;;
esac
命令;;表明流应该跳转到case语句的最后,类似C语言中的break指令。
练习:建立脚本case.sh,当执行时,要求我们在键盘输入适当的值(one|two|three),当输入正确时并打印,当输入错误 时会提示你,应该输入正确的值。


#### 作业1



作业

  1. ping主机测试
  2. 判断一个用户是否存在
  3. 判断当前内核主版本是否为3,且次版本是否大于10
  4. 判断vsftpd软件包是否安装,如果没有则自动安装 (yum是否能用,不能用自动修复,安装完成测试以下,是否能用。)
  5. 判断httpd是否运行
  6. 判断指定的主机是否能ping通,必须使用$1变量
  7. 报警脚本,要求如下:
    根分区剩余空间小于20%
    内存已用空间大于80%
    向用户alice发送告警邮件
    配合crond每5分钟检查一次
    echo “邮件正文” | mail -s “邮件主题” alice 可以报警
  8. 判断用户输入的是否是数字
    read -p “请输入:” get
    case $get in
    [0-9][0-9]*) #判断输入是否是数字
    echo -e “你输入是数字。\n”
    ;;
    *)
    echo -e “你输入的不是数字。\n”
    ;;
    esac

#### shell 分支case语句



case $var in
模式1)
执行1
;;
模式2)
执行2
;;
模式3)
执行3
;;
*)
执行4
esac

第一行: 声明case关键字调用case语法, 紧跟的“变量”一般为用户的输入值, in代表从下方的各个模式进行匹配
第2-4行: 匹配到“模式1”后进行命令的输出或执行, 模式1: 一般为字符或数值
第11-12行: 当用户输入的字符不存在匹配模式时, 直接执行或打印*)下的命令或语句


示例:



[root@bavdu shell_scripts]# vim system_tools
#!/usr/bin/env bash
cat <<-EOF
±------------------------------------------------------------------------+
| System_tools V1.0 |
±------------------------------------------------------------------------+
| a. Stop And Disabled Firewalld. |
| b. Disabled SELinux Secure System. |
| c. Install Apache Service. |
| d. Quit |
±------------------------------------------------------------------------+
EOF
echo "Please input your select: " && read var
case “$var” in
“a”)
systemctl stop firewalld && systemctl disable firewalld
;;
“b”)
setenforce 0
;;
“c”)
yum -y install httpd httpd-tools
;;
“d”)
exit
;;
*)
printf “请按照上方提供的选项输入!!!\n”
;;
esac


#### 七、shell编程-循环结构


#### shell循环-for语句



for i in {取值范围} # for 关键字 i 变量名 in 关键字 取值范围格式 1 2 3 4 5
do # do 循环体的开始
循环体
done # done 循环体的结束
#!/usr/bin/env bash

Author:

Date: 2019//

for i in {1…100}
do
echo KaTeX parse error: Expected 'EOF', got '#' at position 9: i done #̲!/bin/bash …i"
done


测试生产环境的主机存活性



#!/usr/bin/env bash #

Author: #{}& 并发

ip_alive.txt # 在执行脚本之前,先将文件清空
ip_down.txt
segment=“192.168.161”
for i in {2…254}
do
{
ping -c1 s e g m e n t . segment. segment.i &>/dev/null
if [ $? -eq 0 ];then
printf “alive: s e g m e n t . segment. segment.i\n” >>ip_alive.txt
else
printf “down: s e g m e n t . segment. segment.i\n” >>ip_down.txt
fi
}&
done
wait #等待循环结束后,执行下面操作
echo “finish…”


for循环批量创建用户



#!/bin/bash
while : #死循环
do
read -p “请设置用户前缀/数量/密码: " prefix num pass
cat <<-EOF # 打印到屏幕
用户前缀: p r e f i x 用户数量 : prefix 用户数量: prefix用户数量:num
用户密码:$pass
EOF
read -p “是否确认创建:[Y/N]” action
if [ $action = Y ];then
“starting create users…”
break
fi
done
for i in seq -w $num
do
user= p r e f i x prefix prefixi
id $user &>/dev/null
if [ ? − e q 0 ] ; t h e n e c h o " ? -eq 0 ];then echo " ?eq0];thenecho"user is already exist”
else
useradd $user
echo $pass | passwd --stdin $user &>/dev/null # 用户密码设置不需要交互
fi
done


#### shell 循环while语句



while 条件 # while 关键字 条件 [ $1 -lt 10 ] ,while循环,条件为真的情况下,会循环
do
循环体
done


完善系统工具的输出及操作性



创建一个文件里面的用户
#!/bin/bash
while read user
do
id $user &>/dev/null
if [ ? − e q 0 ] ; t h e n e c h o " ? -eq 0 ];then echo " ?eq0];thenecho"user is already exists"
else
useradd $user
echo “create $user successfully”
fi
done < user.txt

#!/usr/bin/env bash

Author:

while 1>0
do
cat <<-EOF
±------------------------------------------------------------------------+
| System_tools V1.0 |
±------------------------------------------------------------------------+
| a. Stop And Disabled Firewalld. |
| b. Disabled SELinux Secure System. |
| c. Install Apache Service. |
| d. Quit |
±------------------------------------------------------------------------+
EOF
echo " Please input your select: " && read var
case “$var” in
“a”)
systemctl stop firewalld && systemctl disable firewalld
;;
“b”)
sed -ri s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
;;
“c”)
yum -y install httpd httpd-tools
;;
“d”)
exit
;;
*)
echo “请按照上方提供的选项输入!!!”
;;
esac
if [ $? -eq 0 ];then
clear
else
echo “Warning: Your program exist ERROR!!!”
break
fi
done

练习题:
输出用户输入的参数,直到用户输入 “end” 结束循环

#!/usr/bin/bash
while 2>1
do
read -p “请输入: " word
if [ w o r d ! = ′ e n d ′ ] ; t h e n e c h o " word != 'end' ];then echo " word!=end];thenecho"word”
else
echo “退出循环”
break
fi
done


#### shell循环until语句



until 条件 # 当后面的条件表达式,为假的时候进行循环,当他为真了就停止循环了。
do
循环体
done
[root@newrain ~]# cat until.sh
#!/bin/bash
x=1
until [ $x -ge 10 ]
do
echo $x
x=expr $x + 1
done
x=1

while [ ! $x -ge 10 ]
do
echo $x
x=expr $x + 1
done


#### shell 循环控制shift、continue、break、exit



shift命令
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢 弃,$0不移动。不带参数的shift命令相当于shift 1。
对于位置变量或命令行参数,其个数必须是确定的,或者当 Shell 程序不知道其个数时,可以把所有参数一起赋值给变量 $*。
若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在 $1 后为 $2,在 $2 后面为 $3 等,则需要用shift把所有参数变成$1
#测试 shift 命令(x_shift3.sh)
[root@newrain shell]# cat x_shift3.sh
#!/bin/bash
shift
echo “第一个位置参数: $1”
[root@newrain shell]# bash x_shift3.sh 2 3
第一个位置参数: 3

#测试 shift 命令(x_shift.sh)
#!/bin/bash
until [ $# -eq 0 ]
do
echo “第一个参数为: $1 参数个数为: $#”
shift
done
执行以上程序x_shift.sh:
$./x_shift.sh 1 2 3 4
结果显示如下:
第一个参数为: 1 参数个数为: 4
第一个参数为: 2 参数个数为: 3
第一个参数为: 3 参数个数为: 2
第一个参数为: 4 参数个数为: 1

从上可知 shift 命令每执行一次,变量的个数($#)减一,而变量值提前一位

用 until 和 shift 命令计算所有命令行参数的和。
#shift 上档命令的应用(x_shift2.sh)
sum=0

until [ $# -eq 0 ]
do
sum=expr $sum + $1
shift
done
echo “sum is: $sum”
执行上述程序:
$x_shift2.sh 10 20 15
其显示结果为:
45

continue、break、exit命令
Linux脚本中的break continue exit return

break
结束并退出本次循环

continue
在循环中不执行continue下面的代码,转而进入下一轮循环

exit
退出脚本
常带一个整数给系统,如 exit 0

可理解为:break是立马跳出循环;continue是跳出当前条件循环,继续下一轮条件循环;exit是直接退出整个脚本
例如:
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
break命令
break命令允许跳出所有循环(终止执行后面的所有循环)。
下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。
代码如下:
#!/bin/bash
while :
do
echo -n "请输入1-5之间的数字 "
read aNum
case $aNum in
1|2|3|4|5)
echo “您的数字是 $aNum!”
;;
*) echo “您输入的数字不再1-5中间,游戏结束!”
break
;;
esac
done
continue命令
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
对上面的例子进行修改:
代码如下:
#!/bin/bash
while :
do
echo -n "请输入1-5之间的数字 "
read aNum
case $aNum in
1|2|3|4|5)
echo “您的数字是 $aNum!”
;;
*)
echo “您输入的数字不再1-5中间,游戏结束!”;、
continue
;;
esac
done

运行代码发现,当输入大于5的数字时,该例中的循环不会结束.
break和exit的区别
[root@newrain shell]# cat case07.sh
#!/bin/bash
while true
do
read -p “请输入[1/2]” num1
case $num1 in
1)
echo $num1
;;
2)
while true
do
read -p “再次输入[1/2]:” num2
case $num2 in
1) echo $num2;;
2) break; #将此处换成exit,再次尝试
esac
done
esac
done


#### 实战-shell版本jumpserver开发(堡垒机)


ps:整理自己的思路,完善不足的地方



#!/usr/bin/env bash

Author:

#可以先添加上账密验证环节
while : # 死循环
do
#trap ‘:’ INT EXIT TSTP TERM HUP # 拒绝 ctrl+c ctrl+d 其他的退出方式
clear
cat <<-EOF
±------------------------------------+
| JumpServer @Version1.0 |
±------------------------------------+
| a. WebServer Apache. |
| b. MySQL Databases Server. |
| c. PHP Development Computer. |
| d. Quit |
±------------------------------------+
EOF
read -p "请输入你要登录的服务器编号: " computer
case $computer in
a)
ssh jumper@192.168.161.129 # 可以嵌套子case循环
;;
b)
ssh jumper@192.168.161.130
;;
c)
ssh jumper@192.168.161.131
;;
d)
exit
;;
*)
printf “ERROR: Please redo your select!”
;;
esac
done


#### 八、shell 编程-函数



function (功能) 功能函数

完成特定功能的代码片段
函数必须先定义才能使用
优点:避免重复的代码

定义函数 1 怎么定义 2 定义什么东西
调用函数 1 可以本地调用,也可以调用别的脚本的函数 2 在不调用之前,它相当于没有
取消函数 1 把函数名想象成一个变量名
函数传参 1 跟脚本传参很类似

命名空间 1 在shell语言中命名空间函数内和函数外是一致的,函数内外不能赋值同样名字的变量
local 1 声明一个本地变量(局部变量)
返回值
return value
value不能超过0-255


#### shell 函数function


函数声明



function_name () {
list of commands
}


函数名 function\_name,这就是你将使用它从其他地方在你的脚本调用。


取消函数



unset myfunc //取消函数
myfunc() //函数定义
{
echo “This is my first shell function”
}
myfunc //函数调用


产生以下执行结果



./test.sh
This is my first shell function
函数必须提前定义测试
[root@newrain fun]# cat fun05.sh
#!/bin/bash
fun () {
echo “hello”
}
fun
unset fun
fun
[root@newrain fun]# bash fun05.sh
hello
fun05.sh: line 8: fun: command not found
函数的返回值,返回的是函数体内最后一条命令是否成功的返回值
[root@newrain fun]# systemctl stop httpd
[root@newrain fun]# cat fun03.sh
#!/bin/bash
fun() {
systemctl status httpd &>/dev/null
systemctl status vsftpd &>/dev/null
}
fun
echo $?
[root@newrain fun]# systemctl stop vsftpd
[root@newrain fun]# bash fun03.sh
3


函数传参 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 \$n 的形式来获取参数的值,例如,$1表示第一个参数,\$2表示第二个参数


示例



[root@newrain fun]# cat fun06.sh
#!/bin/bash
fun() {
echo $[$1*$2*$3]
}
fun 1 2 3
修改版:
[root@newrain fun]# cat fun06.sh
#!/bin/bash
if [ ! $# -eq 3 ];then
echo “Must Input Three number: p1 p2 p3”
exit fi
fun() {
echo $[$1*$2*$3]
}
fun $1 $2 $3


#### 九、shell 编程-数组


普通数组:只能用整数作为数组的索引 关联数组:可以使用字符串作为数组的索引


#### 数组定义



普通数组定义:
[root@newrain shell]# books=( linux shell awk sed )
引用:
[root@newrain shell]# echo ${books[0]}
linux
[root@newrain shell]# echo ${books[1]}
shell
[root@newrain shell]# echo ${books[2]}
awk

关联数组需要提前声明
declare -A myarry1
[root@newrain shell]# declare -A myarry1
[root@newrain shell]# myarry1=([name]=newrain [sex]=man [age]=26)
[root@newrain shell]# echo ${myarry1[name]}
newrain
[root@newrain shell]# echo ${myarry1[age]}
26
定义方法1:
# declare -a myarry=(5 6 7 8)
# echo ${myarry[2]}
显示结果为 7

定义方法2:
# array=( one two three four five six )
# array2=(tom jack alice)
# array3=(cat /etc/passwd)
# array4=(tom jack alice “bash shell”)
# array5=(1 2 3 4 5 6 7 “linux shell” [20]=saltstack)

定义方法3: # 普通数组下标只能是数字
#!/bin/bash
area[11]=23
area[13]=37
area[51]=“UFOs”


#### 访问数组


当设置任何数组变量时,可以访问它



[root@newrain shell]# aa=(haha heihei baibai)
[root@newrain shell]# echo ${aa[0]} //访问数组中的第一个元素
[root@newrain shell]# echo ${aa[@]} //访问数组中所有的元素,等同与echo ${aa[*]}
[root@newrain shell]# echo ${#aa[@]} //统计元素的个数
[root@newrain shell]# echo ${!aa[@]} //统计索引


`${array_name[index]} //引用`


示例



#!/bin/bash
NAME[0]=“BJ”
NAME[1]=“SH”
NAME[2]=“SZ”
NAME[3]=“GZ”
NAME[4]=“HZ”
NAME[5]=“ZZ”
echo “First Index: ${NAME[0]}”
echo “Second Index: ${NAME[1]}”
echo “sixth Index: ${NAME[5]}”


输出结果为



$./test.sh
First Index: BJ
Second Index: SH
sixth Index: ZZ


您可以访问数组中的所有项目通过以下方式之一:



${array_name[*]}
${array_name[@]}


示例



#!/bin/sh
NAME[0]=“BJ”
NAME[1]=“SH”
NAME[2]=“SZ”
NAME[3]=“GZ”
NAME[4]=“HZ”
echo “First Index: ${NAME[*]}”
echo “Second Index: ${NAME[@]}”


输出结果



$./test.sh
First Index: BJ SH SZ GZ HZ
Second Index: BJ SH SZ GZ HZ


疑难点 shell数组中"\*" 和 "@" 区别



关于在shell脚本中数组变量中 “”跟 “@” 区别
”当变量加上“” 会当成一串字符串处理.
“@”变量加上“” 依然当做数组处理.
在没有加上“” 的情况下 效果是等效的.


示例



#!/usr/bin/env bash
array=(gz cloud 19)
echo “case 1”
for line in “${array[@]}”
do
echo $line
done

echo “case 2”
for line in “${array[*]}”
do
echo $line
done

echo “case 3”
for line in ${array[*]}
do
echo $line
done

echo “case 4”
for line in ${array[@]}
do
echo $line
done


执行结果



case 1
gz
cloud
19
case 2
gz cloud 19
case 3
gz
cloud
19
case 4
gz
cloud
19
遍历数组while
[root@newrain array]# cat array01.sh
#!/bin/bash
#++ i 是先自加1后赋值;i ++ 是先赋值后自加1。
while read line
do
host[i++]=$line # 观察i++ 和 ++i的区别
done </etc/hosts
for i in KaTeX parse error: Expected 'EOF', got '#' at position 14: {!host[@]} #̲ 数组的元素索引 do …i:KaTeX parse error: Expected 'EOF', got '#' at position 45: …@newrain array]#̲ cat array02.sh…line
done
for i in ${!host[@]}
do
echo ${host[i]}
done
以上两个脚本都是读取文件中的行,然后加到一个数组中并进行遍历。

练习题:统计shell的种类和数量
思路:最后一列的sh种类不同,我们可以单独取出最后一列 /etc/passwd


#### 十、正则表达式RE




---




---


正则表达式基本元字符


正则表达式拓展元字符


用来处理文本



> 
>  正则表达式(Regular Expression, RE)是一种字符模式, 用于在查找过程中匹配指定的字符. 在大多数程序里, 正则表达式都被置于两个正斜杠之间;  
>    
>  例如/l[oO]ve/就是由正斜杠界定的正则表达式, 它将匹配被查找的行中任何位置出现的相同模式. 在正则表达式中,元 字符是最重要的概念  
>    
>  元字符使正则表达式具有处理能力。所谓元字符就是指ß那些在正则表达式中具有特殊意义的专用字符,可以用来规定 其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。  
> 


#### No.1 正则表达式基本元字符



基本正则表达式元字符
元字符
示例 功能
^ 行首定位符
^love

$ 行尾定位符
love$

. 匹配单个字符
l…e

  •                   匹配前导符0到多次
    

ab*love

.* 匹配任意多个字符 (贪婪匹配

[] 匹配方括号中任意一个字符
[lL]ove

[ - ] 匹配指定范围内的一个字符
[a-z0-9]ove

[^] 匹配不在指定组里的字符
[^a-z0-9]ove

\ 用来转义元字符
love.

< 词首定位符 #由数组或字母组成的
<love

> 词尾定位符
love>

() 匹配后的标签 # 在vim中测试


#### No.2正则表达式拓展元字符



= 等于 != 不等于 =~ 匹配
扩展正则表达式元字符

  •                   匹配一个或多个前导字符
    

[a-z]+ove

? 匹配零个或一个前导字符
lo?ve

a|b 匹配a或b
love|hate

() 组字符loveable|rs
love(able|rs) ov+ ov+ (ov)+

(…)(…)\1\2 标签匹配字符 #
(love)able\1er

x{m} 字符x重复m次
o{5}

x{m,} 字符x重复至少m次
o{5,}

x{m,n} 字符x重复m到n次
o{5,10}


#### 十一、shell 编程-grep



egrep 支持正则表达式的拓展元字符 (或grep -E)
#egrep ‘[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}’ file1.txt
[root@newrain ~]# num1=1
1、运用正则,判断需要[[ ]]
[root@newrain ~]# [[ n u m 1 =   [ 0 − 9 ] + num1 =~ ^[0-9]+ num1= [09]+ ]] && echo “yes” || echo “no”
yes
[root@newrain ~]# num3=1b1
[root@newrain ~]# [[ n u m 3 =   [ 0 − 9 ] + num3 =~ ^[0-9]+ num3= [09]+ ]] && echo “yes” || echo “no”
no
[root@newrain ~]# [[ n u m =   [ 0 − 9 ] + [ ˙ 0 − 9 ] + num =~ ^[0-9]+\.[0-9]+ num= [09]+[˙09]+ || n u m =   [ 0 − 9 ] + num =~ ^[0-9]+ num= [09]+ ]] && echo “yes” || echo “no” //输入的只能是数字(包括小数)

2、* 0或多个
[root@newrain ~]# useradd abrt
[root@newrain ~]# grep ‘abc*’ /etc/passwd
abrt❌1041:1041::/home/abrt:/bin/bash

3、< 词首定位符号 >词尾定位符号
[root@newrain ~]# cat jack.txt
Jack JACK JAck jackly
:% s/<[Jj]ack>/123/g

4、^以什么开头
[root@newrain ~]# grep ‘^root’ /etc/passwd
root❌0:0:root:/root:/bin/bash

5、KaTeX parse error: Expected 'EOF', got '#' at position 23: …root@newrain ~]#̲ grep 'bash’ /etc/passwd
root❌0:0:root:/root:/bin/bash
confluence❌1000:1000:Atlassian Confluence:/home/confluence:/bin/bash
to❌1003:1003::/home/to:/bin/bash

6、. 匹配单个字符
[root@newrain ~]# grep ‘r…t’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin
[root@newrain ~]# grep ‘r.t’ /etc/passwd
operator❌11:0:operator:/root:/sbin/nologin
sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

7、.* 任意多个字符
[root@newrain ~]# grep ‘r.*t’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network❌192:192:systemd Network Management:/:/sbin/nologin polkitd❌999:997:User for polkitd:/:/sbin/nologin postfix❌89:89::/var/spool/postfix:/sbin/nologin
sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin
tss❌59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
apache❌48:48:Apache:/usr/share/httpd:/sbin/nologin
abrt❌1041:1041::/home/abrt:/bin/

8、[] 匹配方括号中的任意一个字符
[root@newrain ~]# grep ‘Root’ /etc/passwd
[root@newrain ~]# grep ‘[Rr]oot’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin

9、[ - ] 匹配指定范围内的一个字符
[root@newrain ~]# grep [a-z]oot /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin

10、[^] 匹配不在指定组内的字符,取反得意思
[root@newrain ~]# grep ‘[^0-9]oot’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin

[root@newrain ~]# grep ‘[^0-9A-Z]oot’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin
[root@newrain ~]# grep ‘[^0-9A-Za-z]oot’ /etc/passwd
[root@newrain ~]#
[root@newrain ~]# useradd Root
[root@newrain ~]# grep ‘[a-z]oot’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin Root❌1042:1042::/home/Root:/bin/bash
[root@newrain ~]# grep ‘1oot’ /etc/passwd
root❌0:0:root:/root:/bin/bash
在[]内表示取反,在[]外表示以什么开头

11、()匹配后的标签
[root@newrain ~]# cat file1.txt
IPADDR=192.168.1.123
GATEWAY=192.168.1.1
NETMASK=255.255.255.0
DNS=114.114.114.114
:% s#(192.168.1.)123#\12#
:% s#(192.)(168.)(1.)2#\1\2\35#
:% s(192.)(168.)(1.)(5)#\1\26.\4#

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


  1. rc ↩︎

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值