case
case 语句是 shell 中流控制的第二种方式,语法如下:
case $word in
pattern1)
list1
;;
pattern2)
list2
;;
patternN)
listN
;;
)
list
;;
esac
命令;;表明流应该跳转到case语句的最后,类似C语言中的break指令。
练习:建立脚本case.sh,当执行时,要求我们在键盘输入适当的值(one|two|three),当输入正确时并打印,当输入错误 时会提示你,应该输入正确的值。
#### 作业1
作业
- ping主机测试
- 判断一个用户是否存在
- 判断当前内核主版本是否为3,且次版本是否大于10
- 判断vsftpd软件包是否安装,如果没有则自动安装 (yum是否能用,不能用自动修复,安装完成测试以下,是否能用。)
- 判断httpd是否运行
- 判断指定的主机是否能ping通,必须使用$1变量
- 报警脚本,要求如下:
根分区剩余空间小于20%
内存已用空间大于80%
向用户alice发送告警邮件
配合crond每5分钟检查一次
echo “邮件正文” | mail -s “邮件主题” alice 可以报警 - 判断用户输入的是否是数字
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= [0−9]+ ]] && echo “yes” || echo “no”
yes
[root@newrain ~]# num3=1b1
[root@newrain ~]# [[
n
u
m
3
=
[
0
−
9
]
+
num3 =~ ^[0-9]+
num3= [0−9]+ ]] && echo “yes” || echo “no”
no
[root@newrain ~]# [[
n
u
m
=
[
0
−
9
]
+
[
˙
0
−
9
]
+
num =~ ^[0-9]+\.[0-9]+
num= [0−9]+[˙0−9]+ ||
n
u
m
=
[
0
−
9
]
+
num =~ ^[0-9]+
num= [0−9]+ ]] && 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从入门到精通
======================
-
linux从入门到精通(第2版)
-
Linux系统移植
-
Linux驱动开发入门与实战
-
LINUX 系统移植 第2版
-
Linux开源网络全栈详解 从DPDK到OpenFlow
第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。
本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。
需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
rc ↩︎