分类目录归档:Linux

条件判断与流程控制

一、流程控制语句
1、条件判断式
1)按照文件类型进行判断
According to the file type

两种判断格式

[root@localhost ~]# test -e /root/install.log
[root@localhost ~]# [ -e /root/install.log ]

简单的判断式

[root@localhost ~]# [ -d /root ] && echo "yest" || echo "no"
#第一个判断命令如果正确执行,则打印"yes",否则打印"no"

2)按照文件权限进行判断
According to the file permissions for judgment

[root@localhost ~]# [ -w student.txt] && echo "yes" || echo "no"
#判断文件是拥有写权限的

3)两个文件之间进行比较
Comparison between the two files

[root@localhost ~]# ln /root/student.txt /tmp/stu.txt
#创建硬链接
[root@localhost ~]# [ /root/student.txt -ef /tmp/stu.txt] && echo "yes" || echo "no"
#判断两个文件是否为同一个文件

4)两个整数之间的比较
The comparison between two integer

[root@localhost ~]# [ 23 -ge 22 ] && echo "yes" || echo "no"
#判断23是否大于等于22

[root@localhost ~]# [ 23 -le 22 ] && echo "yes" || echo "no"
#判断23是否小于等于22

5)字符串的判断
A string of judgment

[root@localhost ~]# name=fengj
@给name变量赋值
[root@localhost ~]# [ -z "$name" ] && echo "yes" || echo "no"
#判断name变量是否为空

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和变量bb赋值
[root@localhost ~]# [ "$aa" == "bb" ] && echo "yes" || echo "no"
#判断两个变量的值是否相等

6)多重条件判断
Multiple conditions determine

[root@localhost ~]# aa=11
[root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
#判断变量aa是否有值,同时判断变量aa的是否大于23
#因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假

2、单分支if语句
单分支if条件语句

if [ 条件判断式 ];then
   程序
fi
#或者
if [ 条件判断式 ]
   then
   程序
fi

单分支条件语句需要注意几个点
#if语句使用fi结尾,和一般语言使用大括号结尾不同
#[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
#then后面跟符合条件之后执行的程序,可以放在[]之后,用”;”分割。也可以换行写入,就不需要”;”了

例子1:判断登陆的用户是否为root

#!/bin/bash
test=$(env | grep "USER" | cut -d "=" -f 2)
if [ "$test" == root]
   then
   echo "Current user is root."
fi

例子2:判断分区使用率

#!/bin/bash
#统计根分区使用率

#把根分区使用率作为变量值赋予变量rate
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f 1)

if [ $rate -ge 80 ]
then
    echo "Warning! /dev/sda3 is full!!"
fi

3、双分支if语句
双分支if条件语句

if [ 条件判断式 ]
then
    条件成立时,执行的程序
else
    条件不成立时,执行的另一个程序
fi

例子1:判断输入的是否是一个目录

#!/bin/bash
#判断输入的文件是否是一个目录
read -t 30 -p "Please input a directory: " dir

if [ -d $dir ]
then
    echo "yes"
else
    echo "no"
fi

例子2:判断apache是否启动

#!/bin/bash
#截取httpd进程,并把结果赋予变量test
test=$(ps aux | grep httpd | grep -v grep)
if [ -n "$test" ]
#如果test的值不为空,则执行then中命令
then
    echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
else
    /etc/rc.d/init.d/httpd start &> /dev/null
    echo "$(date) restart httpd !!" >> /tmp/autostart-err.log
fi

4、多分支if语句
多分支if条件语句

if [ 条件判断式1 ]
   then
       当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
   then
       当条件判断式2成立时,执行程序2
...省略更多条件
else
       当所有条件都不成立时,最后执行此程序
fi

例子

#!/bin/bash
#字符界面加减乘除计算器

read -t 30 -p "Please input num1: " num1
read -t 30 -p "Please input num2: " num2
#通过read命令接收要计算的数值,并赋予变量num1和num2
read -t 30 -p "Please input a operator: " ope

if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
#第一层判断,用来判断num1,num2和ope中都有值
then
       test1=$(echo $num1 | sed 's/[0-9]//g')
       test2=$(echo $num2 | sed 's/[0-9]//g')
       #定义变量test1和test2的值为$(命令)的结果
       #后续命令作用是,把变量test1的值替换为空。如果能替换为空,证明num1的值为数字
       #如果不能替换为空,证明num1的值为非数字。我们使用这种方法判断变量num1的值为数字
       #用同样的方法测试test2变量

       if [ -z "$test1" -a -z "$test2" ]
          #第二层判断,用来判断num1和num2为数值
          #如果变量test1和test2的值为空,则证明num1和num2是数字
          then
          #如果test1和test2是数字,则执行以下命令
          if [ "$ope" == '+' }
             #第三层判断用来确认运算符
             #测试变量$ope中是什么运算符
             then
                sum=$(( $num1 + $num2))
                #如果是加号则执行加法运算
          elif [ "$ope" == '-' ]
             then
                 sum=$(($num1 - $num2))
                 #如果是减号,则执行减法运算
          elif [ "$ope" == '*' ]
             then
                 sum=$(( $num1 * $num2))
                 #如果是乘号,则执行乘法运算
          elif [ "$ope" == '/' ]
             then
                 sum=$(( $num1 / $num2))
                 #如果除号,则执行除法运算
          elif [ "$ope" == '%' ]
             then
                 sum=$(( $num1 % $num2))
                 #如果是取模,则执行取模运算
          else
             echo "Please enter a valid symbol"
             #如果运算符不匹配,提示输入有效的符号
             exit 10
             #并退出程序,返回错误代码10
          fi
       elif
           #如果test1和test2不为空,说明num1和num2不是数字
           echo "Please enter a valid value"
           #则提示输入有效的数值
           exit 11
           #并退出程序,返回错误代码11
       fi
elif
    echo "qing shuru neirong"
    exit 12
fi

echo " $num1 $ope $num2 : $num"
#输出数值运算的结果

例子:从1加到100

#!/bin/bash
#从1加到100

s=0
for(( i=1;i<=100;i=i+1 ))
  do
    s=$(( $s+$i))
  done
echo "The sum of 1+2+...+100 is: $s"

例子:批量添加指定数量的用户

#!/bin/bash
#批量添加指定数量的用户

read -p "Please input user name: " -t 30 name
read -p "Please input the number of users: " -t 30 num
read -p "Please input the password of users: " -t 30 pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass"]
then
   y=$(echo $num | sed 's/[0-9]//g')
   if [ -z "$y" ]
   then
     for(( i=1;i<=$num;i=i+1 )) do /usr/sbin/useradd $name$i &>/dev/null
         echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
       done
   fi
fi

5、case语句
多分支case条件语句
#case语句和if..elif..else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

case $变量名 in
    "值1")
      如果变量的值等于值1,则执行程序1
      ;;
    "值2")
      如果变量的值等于值2,则执行程序2
      ;;
    ...省略其他分支
    *)
      如果变量的值都不是以上的值,则执行此程序
      ;;
esac

6、for循环
语法一:

for 变量 in 值1 值2 值3 ...
  do
    程序
  done

例子:批量解压脚本

#!/bin/bash
#批量解压缩脚本

cd /root/test
ls *.tar.gz > /tmp/ls.log
for i in $(cat ls.log)
   do
     tar -zxf $i &>/dev/null
   done
rm -rf /tmp/ls.log

语法二

for (( 初始值;循环控制条件;变量变化 ))
   do
     程序
   done

7、while循环和until循环
1)while循环
while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才停止。这就和for的固定循环不太一样了。

while [ 条件判断式 ]
   do
      程序
   done

2)until循环
# until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。

until [ 条件判断式 ]
  do 
    程序
  done

Shell正则表达式

一、正则表达式
1、正则表达式是什么
#正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。

2、正则表达式与通配符
#正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。
#通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了

通配符
— * 匹配任意内容
— ? 匹配任意一个内容
— [] 匹配中括号中的一个字符

3、基础正则表达式
Based on regular expressions

1)”.”匹配除了换行符任意一个字符

"s..d"
#"s..d"会匹配在s和d这两个字母之间一定有两个字符的单词
"s.*d"
#匹配s和d字母之间有任意字符
".*"
#匹配所有内容

2)”^”匹配行首,”$”匹配行尾

"^M"
#匹配以大写“M”开头的行
"n$"
#匹配以小写"n"结尾的行
"^$"
#会匹配空白行

3)”[]”匹配中括号中指定的任意一个字符,只匹配一个字符

"s[ao]id"
#匹配s和i字母中,要不是a、要不是o
"[0-9]
#匹配任意一个数字
"^[a-z]"
#匹配用小写字母开头的行

4)”[^]”匹配除中括号的字符以外的任意一个字符

"^[^a-z]"
#匹配不用小写字母开头的行
"^[^a-aA-Z]"
#匹配不用字母开头的行

5)”\”转义符

"\.$"
#匹配使用"."结尾的行

6)”\{n\}”表示其前面的字符恰好出现n次

"a\{3\}"
#匹配a字母连接出现三次的字符串
"[0-9]\{3\}"
#匹配包含连续的三个数字的字符串

7)”\{n,\}表示其前面的字符出现不小于n次

"^[0-9]\{3,\}[a-z]
#匹配最少用连续三个数字开头的行

8)”\{n,m\}”匹配其前面的字符至少出现n次,最多出现m次

"sa\{1,3\}i"
#匹配在字母s和字母i之间有最少一个a,最多三个a

4、例子

[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}
#匹配日期格式YYYY-MM-DD

[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}
#匹配IP地址

二、字符截取命令
1、cut字段提取命令
[root@localhost ~]# cut [选项] 文件名
选项:
— -f 列号:提取第几列
— -d 分隔符:按照指定分隔符分割列

cut命令的局限
— df -h | cut -d ” ” -f 1,3

2、printf命令
printf ‘输出类型输出格式’ 输出内容

输出类型:
— %ns:输出字符串。n是数字指代输出几个字符
— %ni:输出整数。n是数字指代输出几个数字
— %m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数如%8.2f代表共输出8位数,其中2位是小数,6位是整数。

输出格式:
— \a:输出警告声音
— \b:输出退格键,也就是Backspace键
— \f:清除屏幕
— \n:换行
— \r:回车,也就是Enter键
— \t:水平输出退格键,也就是Tab键
— \v:垂直输出退格键,也就是Tab键

例:

[root@localhost ~]# printf %s 1 2 3 4 5 6
[root@localhost ~]# printf %s %s %s 1 2 3 4 5 6
[root@localhost ~]# printf '%s %s %s' 1 2 3 4 5 6 
[root@localhost ~]# printf '%s %s %s\n' 1 2 3 4 5 6 

[root@localhost ~]# printf '%s' $(cat student.txt)
#不调整输出格式

[root@localhost ~]# printf '%s\t%s\t%s\t%s\n $(cat student.txt)
#调整格式输出

在awk命令的输出中支持print和printf命令
— print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
— printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

3、awk命令
# awk ‘条件1{动作1} 条件2{动作2}…’ 文件名

条件(Pattern)
— 一般使用关系表达式作为条件
— x>10判断变量 x是否大于10
— x>=10大于等于
— x<=10小于等于
动作(Action)
— 格式化输出
— 流程控制语句

例:

[root@localhost ~]# vim student.txt
student.txt content
ID      Name    gender  Mark
1       furong  F       85
2       fengj   F       60
3       cang    F       70
[root@localhost ~]# awk '{printf $2 "\t" $4 "\n"}' student.txt
[root@localhost ~]# df -h | awk '{print $1 "\t" $3}'

BEGIN
[root@localhost ~]# awk ‘BEGIN{printf “This is a transcript \n”} {printf $2 “\t” $4 “\n”}’ student.txt

END
[root@localhost ~]# awk ‘END{printf “The End\n”} {printf $2 “\t” $4 “\n”}’ student.txt

FS内置变量
[root@localhost ~]# cat /etc/passwd | grep “/bin/bash” | awk ‘BEGIN{FS=”:”}{printf $1 “\t” $3 “\n”}’

关系运算符
[root@localhost ~]# cat student.txt | grep -v Name | awk ‘$4>=70{printf $2 “\n”}’

4、sed命令
#sed 是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。

sed [选项] '[动作]' 文件名
选项:
-- -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕。
-- -e:允许对输入数据应用多条sed命令编辑
-- -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出。

动作:
— a:追加,在当前行后添加一行或多行
— c:行替换,用c后面的字符串替换原数据行
— i:插入,在当前行行前插入一行或多行。
— d:删除,删除指定的行
— p:打印,输出指定的行。
— s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。

行数据操作

[root@localhost ~]# sed '2p' student.txt
#查看文件的第二行
[root@localhost ~]# sed -n '2p' student.txt
#查看文件的第二行,且只显示第二行
[root@localhost ~]# sed '2,4d' student.txt
#删除第二行到第四行的数据,但不修改文件本身
[root@localhost ~]# sed '2a piaoliang jiushi renxing' student.txt
#在第二行后追加
[root@localhost ~]# sed '2i meinv' student.txt
#在第二行前插入两行数据
[root@localhost ~]# sed '2c furong bu ji ge' student.txt
#数据替换

字符串替换
sed ‘s/旧字串/新字串/g’ 文件名

[root@localhost ~]# sed '3s/60/99/g' student.txt
#在第三行中,把60换成99

[root@localhost ~]# sed -i '3s/60/99/g' student.txt
#sed操作的数据直接写入文件

[root@localhost ~]# sed -e 's/fengj//g;s/cang//g' student.txt
#同时把"fengj"和"cang"替换为空

三、字符处理
1、排序命令sort
[root@localhost ~]# sort [选项] 文件名
选项:
— -f:忽略大小写
— -n:以数值型进行排序,默认使用字符串型排序
— -r:反向排序
— -t:指定分隔符,默认是分隔符是制表符
— -k n[,m]:按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)

[root@localhost ~]# sort /etc/passwd
#排序用户信息文件

[root@localhost ~]# sort -r /etc/passwd
#反向排序

[root@localhost ~]# sort -t ":" -k 3,3 /etc/passwd
#指定分隔符是":",用第三字段开头,第三字段结尾排序,就是只用第三字段排序

[root@localhost ~]# sort -n -t ":" -k 3,3 /etc/passwd

2、统计命令wc
[root@localhost ~]# wc [选项] 文件名
选项:
— -l:只统计行数
— -w:只统计单词数
— -m:只统计字符数

Shell环境变量配置文件

一、环境变量配置文件简介
1、source命令

[root@localhost ~]# source 配置文件
或
[root@localhost ~]# .配置文件

注:修改配置文件后,必须注销重新登录才能生效,使用source命令可以不用重新登录
例:

[root@localhost ~]# . .bashrc
或
[root@localhost ~]# source .bashrc

2、环境变量配置文件简介
PATH、HISTSIZE、PS1、HOSTNAME等环境变量写入对应的环境变量配置文件
环境变量配置文件中主要是定义对系统操作环境生效的系统默认环境变量,如PATH等

— /etc/profile
— /etc/profile.d/*.sh
— ~/.bash_profile
— ~/.bashrc
— /etc/bashrc

二、环境变量配置文件的功能
Environment variable configuration file

1、/etc/profile的作用
USER变量:
LOGNAME变量:
MAIL变量:
PATH变量:
HOSTNAME变量:
HISTSIZE变量
umask:
调用/etc/profile.d/*.sh文件

2、umask权限
#查看系统默认权限
注意:
1)文件最高权限为666
2)目录最高权限为777
3)权限不能使用数据进行换算,而必须使用字母
4)umask定义的权限,是系统默认权限中准备丢弃的权限

3、~/.bash_profile的作用
调用了~/.bashrc文件。
在PATH变量后面加入了”:$HOME/bin”这个目录

4、~/.bashrc的作用
定义默认别名
调用/etc/bashrc

5、/etc/bashrc的作用
PS1变量
umask
PATH变量
调用/etc/profile.d/*.sh文件

三、其他配置文件
1、注销时生效的环境变量配置文件
~/.bash_logout

2、命令历史记录文件
~/.bash_history

3、Shell登录信息
1)本地终端欢迎信息:/etc/issue
Shell login information

2)远程终端欢迎信息:/etc/issue.net
#转义符在/etc/issue.net文件中不能使用
#是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入”Banner /etc/issue.net”行才能显示(记得重启SSH服务)

3)登录后欢迎信息:/etc/motd
#不管是本地登录,还是远程登录,都可以显示此欢迎信息

Shell运算符

一、declare命令
1、declare声明变量类型
— [root@localhost ~]# declare [+/-][选项] 变量名
选项:
— -:给变量设定类型属性
— +:取消变量的类型属性
— -a:将变量声明为数组型
— -i:将变量声明为整数型(integer)
— -x:将变量声明为环境变量
— -r:将变量声明为只读变量
— -p:显示指定变量的被声明类型

2、变量声明为数值型

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和bb赋值
[root@localhost ~]# declare -i cc=$aa+$bb
#声明变量cc的类型是整数型,它的值是aa和bb的和

3、声明数组

#定义数组
[root@localhost ~]# movie[0]=zp
[root@localhost ~]# movie[1]=tp
[root@localhost ~]# declare -a movie[2]=live
#查看数组
[root@localhost ~]# echo ${movie}
[root@localhost ~]# echo ${movie[2]}
[root@localhost ~]# echo ${movie[*]}

4、声明环境变量
declare -x test =123
#和export作用相似,但其实是declare命令的作用

5、声明变量只读属性
[root@localhost ~]# declare -r test
#给test赋予只读属性,但是请注意只读属性会让变量不能修改不能删除,甚至不能取消只读属性

6、查询变量的属性
declare -p
#查询所有变量的属性

declare -p 变量名
#查询指定变量的属性

二、数值运算的方法
1、数值运算方法1

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和bb赋值
[root@localhost ~]# declare -i cc=$aa+$bb

2、方法2:expr或let数值运算工具

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和变量bb赋值
[root@localhost ~]# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和。注意”+“号左右两侧必须有空格

3、方法3:”$((运算式))” 或 “$[运算式]”

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(($aa+$bb))
[root@localhost ~]# gg=$[$aa+$bb]

4、运算符
The operator

例:

[root@localhost ~]# aa=$(((11+3)*3/2))
#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级

[root@localhost ~]# bb=$((14%3))
#14不能被3整除,余数是2

[root@localhost ~]# cc=$((1&&0))
#逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0

三、变量测试
Variable test

Shell变量

一、什么是变量与变量分类
1、什么是变量
# 变量是计算机内存的单元,其中存放的值可以改变
# 变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此它们十分有用。

2、变量命名规则
# 变量名必须以字母或下划线打头,名字中间只能由字母、数字和下划线组成。
# 变量名的长度不得超过255个字符。
# 变量名在有效的范围内必须是唯一的。
# 在Bash中,变量的默认类型都是字符串型

3、变量按照存储数据分类
# 字符串型
# 整型
# 浮点型
# 日期型

4、变量的分类
# 用户自定义变量。变量自定义的
# 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的
# 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
# 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

二、用户自定义变量
1、定义变量
变量名=变量值(等号前后不能有空格)
例如:
— x=5
— name=”jie cao”

2、变量调用
echo $变量名
例如:
— echo $x
— echo $name

3、变量叠加
— x=123
— x=”$x”456
— x=${x}789

4、变量查看
set
选项
— u:如果设定此选项,调用未声明变量时会报错(默认无任何提示)

5、变量删除
unset 变量名

三、环境变量
1、环境变量与用户自定义变量的区别?
# 环境变量和用户自定义变量最主要的区别在于,环境变量是全局变量,而用户自定义变量是局部变量。用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效
# 变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的

— [root@localhost ~]# pstree
# 查看进程树

2、设置环境变量
export 变量名=变量值

变量名=变量值
export 变量名

3、查看环境变量
set
# 查看所有变量

env
# 查看环境变量

4、删除环境变量
unset 变量名

5、常用环境变量
— HOSTNAME:主机名
— SHELL:当前的shell
— TERM:终端环境
— HISTSIZE:历史命令条数
— SSH_CLIENT:当前操作环境是用ssh连接的,这里记录客户端ip
— SSH_TTY:ssh连接的终端时pts/1
— USER:当前登录的用户

6、PATH环境变量
PATH变量:系统查找命令的路径

— echo $PATH
# 查看PATH环境变量

— PATH=”$PATH”:/root/sh
#增加PATH变量的值

7、PS1环境变量
PS1变量:命令提示符设置
— \d:显示日期,格式为”星期 月 日“
— \H:显示完整的主机名。如默认主机名”localhost.localdomain”
— \t:显示24小时制时间,格式为”HH:MM:SS”
— \A:显示24小时制时间,格式为”HH:MM”
— \u:显示当前用户名
— \w:显示当前所在目录的完整名称
— \W:显示当前所在目录的最后一个目录
— \$:提示符。如果是root用户会显示提示符为”#”,如果是普通用户会显示提示符为”$”

例:
— [root@localhost ~]# PS1='[\u@\A \w]\$ ‘

8、当前语系查询
locale
# 查询当前系统语系
— LANG:定义系统主语系的变量
— LC_ALL:定义整体语系的变量

9、语系变量LANG
echo $LANG
# 查看系统当前语系
locale -a | more
# 查看Linux支持的所有语系

10、查询系统默认语系
cat /etc/sysconfig/i18n

11、Linux中文支持
前提条件,正确安装的中文字体和中文语系
# 如果有图形界面,可以正确支持中文显示
# 如果使用第三方远程工具,只要语系设定正确,可以支持中文显示
# 如果使用纯字符界面,必须使用第三方插件(如zhcon等)

四、位置参数变量
1、位置参数变量
Location parameter variables

例子1:

#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值

例子2

#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The parameters is:$*"
#使用$*代表所有的参数
echo "The parameters is:$@"
#使用$@也代表所有参数

例子3:$*与$@的区别

#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
  do
      echo "The parameters is $i"  
  done

for y in "$@"
#$@中的每个参数都看成是独立的,所以"$@"中有几个参数,就会循环几次
  do
     echo "Parameter:$y"
  done

五、预定义变量
1、预定义变量
The predefined variables

2、接收键盘输入
read [选项] [变量名]
选项:
— -p “提示信息”:在等待read输入时,输出提示信息
— -t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
— -n 字符数:read命令只接受指定的字符数,就会执行
— -s:隐藏输入的数据,适用于机密信息的输入

用户管理

一、用户和用户组的概念
用户:使用操作系统的人
用户组:具有相同系统权限的一组用户

/etc/group 存储当前系统中所有用户组信息
— Group: x : 123 : abc,def,xyz
— 组名称:组密码占位符:组编号:组中用户名列表

/etc/gshadow 存储当前系统中用户组的密码信息
— Group : * : : abc,def,xyz
— 组名称:组密码:组管理者:组中用户名列表

/etc/passwd 存储当前系统中所有用户的信息
— user : x : 123 : 456 : xxxxxxx : /home/user : /bin/bash
— 用户名:密码占位符:用户编号:用户组编号:用户注释信息:用户主目录:shell类型

/etc/shadow 存储当前系统中所有用户的密码信息
— user :vf;/Zu8sdf..:::::
— 用户名:密码:::::

二、用户和用户组的基本命令
groupadd 用户组
#添加用户组
例:
— [root@localhost ~]# groupadd sexy

groupmod -n 新用户组名 旧用户组名
#修改用户组名
例:
— [root@localhost ~]# groupmod -n market sexy

groupmod -g 用户组编号 用户组名称
#修改用户组编号
例:
— [root@localhost ~]# groupmod -g 668 market

groupadd -g 用户组编号 用户组名称
#创建新用户,并指定编号
例:
— [root@localhost ~]# groupadd -g 888 boss

groupdel 用户组名称
#删除用户组
例:
— [root@localhost ~]# groupdel market
注:删除用户组前需要先删除或转移当前用户组的用户

useradd -g 用户组名称 用户名
#添加新用户并指定的用户组
例:
— [root@localhost ~]# useradd -g sexy sdf

useradd -d 用户文件夹 用户名
#添加新用户并指定用户文件夹
例:
— [root@localhost ~]# useradd -d /home/xxx imooc

注:添加新用户时,如果没有指定用户组,会对应生成与用户名相同的用户组

usermod -c 用户备注 用户名
#给用户添加注释
例:
— [root@localhost ~]# usermod -c dgdzmx sdf

usermod -l 新用户名 旧用户名
#修改用户名
例:
— [root@localhost ~]# usermod -l cls sdf

usermod -d 用户文件夹 用户名
#给用户指定新用户文件夹
例:
— [root@localhost ~]# usermod -d /home/cls cls

usermod -g 用户组 用户名
#给用户指定用户组
例:
— [root@localhost ~]# usermod -g sexy imooc

userdel 用户名
#删除用户
例:
— [root@localhost ~]# userdel jzmb

userdel -r 用户名
#删除用户同时删除用户文件夹
例:
— [root@localhost ~]# userdel -r jzmb

touch /etc/nologin
#禁止除了root外的所有用户登录,只要在/etc/下建立nologin文件,文件不包含任何内容

三、用户和用户组进阶命令
passwd -l 用户名
#锁定用户
例:
— [root@localhost ~]# passwd -l cls

passwd -u 用户名
#解锁用户名
例:
— [root@localhost ~]# passwd -u cls

passwd -d 用户名
#清除用户密码
例:
— [root@localhost ~]# passwd -d cls

主要组与附属组
用户可以同时属于多个组
— 一个主要组
— 多个附属组
The main and subsidiary group

gpasswd -a 用户 附属组名称
#给用户添加附属组
例:
— [root@localhost ~]# gpasswd -a cls boss

newgrp 用户组
#用户切换用户组
例:
— [root@localhost ~]# newgrp boss

gpasswd -d 用户名 用户组
#把用户从某用户组中移除
例:
— [root@localhost ~]# gpasswd -d cls boss

useradd -g 主用户组 -G 附属用户组1,附属用户组2… 用户名
#新建用户,并指定用户组及附属用户组
例:
— [root@localhost ~]# useradd -g group1 -G group2,group3… test

gpasswd 用户组名称
#设置用户组密码
例:
— [root@localhost ~]# gpasswd imooc

四、其他命令
su 用户名
#切换用户
例:
— [root@localhost ~]# su username
注:如果只输入su不输入用户名,表示切换到root用户

whoami
#我是谁?显示当前登陆用户名

id 用户名
#显示指定用户信息,包括用户编号、用户名、主要组编号及名称,附属组列表
例:
— [root@localhost ~]# id imooc

groups 用户名
#显示指定用户所在的所有组
例:
— [root@localhost ~]# groups imooc

chfn 用户名
#设置用户资料,依次输入用户资料
例:
— [root@localhost ~]# chfn imooc

finger 用户名
#显示用户详细资料
例:
— [root@localhost ~]# finger imooc

磁盘管理

一、磁盘管理基本命令
1、df 查看磁盘分区使用状况
— l 仅显示本地磁盘(默认)
— a 显示所有文件系统的磁盘使用情况,包含比如/proc/
— h 以1024进制计算最合适的单位显示磁盘容量
— H 以1000进制计算最合适的单位显示磁盘容量
— T 显示磁盘分区类型
— t 显示指定类型文件系统的磁盘分区
— x 不显示指定类型文件系统的磁盘分区

2、du 统计磁盘上的文件大小
— b 以byte为单位统计文件
— k 以KB为单位统计文件
— m 以MB为单位统计文件
— h 按照1024进制以最适合的单位统计文件
— H 按照1000进制以最适合的单位统计文件
— s 指定统计目标

二、硬盘分区和格式化概述
为什么重新提起分区
第一、主分区和扩展分区总数不能超过4个
第二、扩展分区最多只能有一个
第三、扩展分区不能直接存取数据

三、在VM虚拟机中添加硬盘

四、MBR分区
— 主分区不超过4个
— 单个分区容量最大2TB
#Linux系统中硬件设备都是以文件的形式存在于根目录下的dev目录下
#硬件设备都是由Linux系统自动识别的
#必须对硬盘进行分区、格式化、挂载后才能使用

fdisk /dev/磁盘名 进入磁盘分区
fdisk -l 查看磁盘列表

五、GPT分区
#主分区个数“几乎”没有限制
— 在GPT的分区表中最多可以支持128个主分区
#单个分区容量“几乎”没有限制
— 在GPT的分区模式中,每个分区的大小突破了MRB分区的2TB限制

parted分区工具
parted
— select /dev/sdc:切换磁盘
— print:打印当前磁盘的分区信息
— print all:打印所有磁盘的分区信息
— mklabel msdos:创建MBR分区
— mklabel gpt:创建GPT分区

交互模式分区:
(parted) mkpart
Partition name? []? — 输入分区名称,可以直接回车省略
File system type? [ext2]? — 指定文件系统类型,默认为ext2,可以是ext3,ext4
Start? — 这个从哪里开始,第一分区可以”0″从开始,最好从“1”开始,“1”代表1MB,4K对齐
End? — 分区到哪结束

命令模式分区
mkpart test 2000 3000 — “test”是分区名称,不可省略,“2000”是分区的开始位置,“3000”是分区的结束位置

rm 3 — 分区删除,“3”代表分区号
unit GB — 更换分区默认的容量单位为GB,默认为MB

六、分区格式化
mkfs.分区类型 分区

mkfs -t 分区类型 分区
例:
— mkfs.ext3 /dev/sdb1
— mkfs -t ext4 /dev/sdb2

注:扩展分区不能格式化,只有主分区及逻辑分区可以格式化

七、挂载分区
1、临时挂载
mkdir -p /mnt/imooc:建立挂载点
mount /dev/sdb1 /mnt/imooc:挂载分区
umount /mnt/imooc:卸载分区
2、永久挂载
编辑/etc/fstab
— vi /etc/fstab
#在最后一行添加新的挂载记录
设备 挂载点 文件类型 default 0 0
例:/dev/sdb1 /mnt/imooc ext3 default 0 0

八、Swap分区
如何为硬盘添加swap交换分区?
第一,建立一个普通的Linux分区
第二,修改分区类型的16进制编码
第三,格式化交换分区
第四,启用交换分区

例:
[root@localhost ~]# fdisk /dev/sdb
Command (m for help): p — 查看分区详情
Command (m for help): t — 更换分区系统ID
Partition number (1-6): 6 — 选择分区编号
Hex code (type L to list codes): L — 输入“L”查看16进制分区类型编码列表
Hex code (type L to list codes): 82 — 输入16进制分区类型编码
Command (m for help): w — 保存分区修改
[root@localhost ~]# mkswap /dev/sdb6 — 格式化交换分区
[root@localhost ~]# swapon /dev/sdb6 — 启用交换分区
[root@localhost ~]# swapoff /dev/sdb6 — 停用交换分区

一、网络基础

TCPIP model and the corresponding of the OSI modelNetwork based

一、ISO/OSI七层模型
The OSI seven layer model

The OSI seven layers of the framework

二、TCP/IP四层模型
TCPIP four layers model

TCPIP model and the corresponding of the OSI model

网络接口层
#网络接入层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。地址解析协议(ARP)工作在些层,即OSI参考模型的数据链路层。

网际互联层
#网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)

传输层
#传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP)。
TCPIP three-way handshake

应用层
#应用层对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP等。
Data encapsulation process

TCP/IP模型与OSI模型的比较
共同点:
(1)OSI参考模型和TCP/IP参考模型都采用了层次结构的概念
(2)都能够提供面向连接和无连接两种通信服务机制
不同点:
(1)前者是七层模型,后者是四层结构
(2)对可靠性要求不同(后者更高)
(3)OSI模型是在协议开发前设计的,具有通用性。TCP/IP是先有协议集然后建立模型,不适用于非TCP/IP网络。

三、IP地址
The IP header
The IP address
IP address classification

四、子网掩码
子网掩码的使用
The use of the subnet mask_1
The use of the subnet mask_2
The use of the subnet mask_3

Variable-length subnet mask and subnet planning

五、端口作用
TCP protocol in baotou

UDP protocol in baotou

Common port

查看本机启用的端口
netstat -an
选项:
— -a:查看所有连接和监听端口
— -n:显示IP地址和端口号,而不显示域名和服务名

六、DNS作用
#在互联网中,通过IP地址来进行通信
#IP地址用数字表示,记忆起来太困难了(如116.213.120.232)
#人对域名更加敏感,如:http://wwww.imooc.com/

hosts文件
# C:\Windows\System32\drivers\etc\hosts
— 127.0.0.1 localhost

从Hosts文件到DNS
早期Hosts文件解析域名
#名称解析效能下降
#主机维护困难
DNS服务
#层次性
#分布式

DNS服务的作用
将域名解析为IP地址
#客户机向DNS服务器发送域名查询请求
#DNS服务器告知客户机Web服务器的IP地址
#客户机与Web服务器通信

The domain name space structure

DNS查询类型
(1)从查询方式上分
递归查询
#要么做出查询成功响应,要么作出查询失败的响应。一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。
迭代查询
#服务器收到一次迭代查询回复一次结果,这个结果不一定是目标IP与域名的映射关系,也可以是其它DNS服务器的地址。
(2)从查询内容上分
正向查询由域名查找IP地址
反向查询由IP地址查找域名

七、网关作用
1、网关(Gateway)又称网间连接器、协议转换器。
2、网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。
3、网关既可以用于广域网互连,也可以用于局域网互连。
4、网关是一种充当转换重任的服务器或路由器。

二、Linux网络管理

一、Linux配置IP地址
1、ifconfig命令临时配置IP地址
ifconfig命令:查看与配置网络状态命令

例:
— [root@localhost ~]# ifconfig eth0 192.168.0.200 netmask 255.255.255.0
#临时设置eth0网卡的IP地址与子网掩码

2、setup工具永久配置IP地址
红帽(redhat)专有图形化工具setup设置IP地址
注:有些redhat产品没有安装setup工具需另外安装
安装setuptool
— [root@locallhost ~]# yum install setuptool
安装防火墙设置
— [root@locallhost ~]# yum install system-config-securitylevel-tui
安装网络设置
— [root@locallhost ~]# yum install system-config-network-tui
安装系统服务管理
— [root@locallhost ~]# yum install ntsysv

二、Linux网络配置文件
1、网卡信息文件
— [root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
— DEVICE=eth0 网卡设备名
— BOOTPROTO=none 是否自动获取IP(none、static、dhcp)
— HWADDR=00:0c:29:17:c4:09 MAC地址
— NM_CONTROLLED=yes 是否可以同Network Manager图形管理工具托管
— ONBOOT=yes 是否随网络服务启动,eth0生效
— TYPE=Ethernet 类型为以太网
— UUID=”44b76c8a-b59f-44d5-83fa-7f98fda86b3d” 唯一识别码
— IPADDR=192.168.0.252 ip地址
— NETMASK=255.255.255.0 子网掩码
— GATEWAY=192.168.0.1 网关
— DNS1=202.106.0.20 DNS
— IPV6INIT=no IPv6没有启用
— USERCTL=no 不允许非root用户控制该网卡

2、主机名文件
— [root@localhost ~]# 主机名文件
— NETWORKING=yes
— HOSTNAME=localhost.localdomain

— [root@localhost ~]# hostname [主机名]
#查看与临时设置主机名命令

3、DNS配置文件
— [root@localhost ~]# vi /etc/resolv.conf
— nameserver 202.106.0.20
— search localhost

三、虚拟机网络参数配置
1、配置Linux IP地址
2、启动网卡
— [root@localhost ~]#vi /etc/sysconfig/network-scripts/ifcfg-eth0
— 把 ONBOOT=no
— 改为 ONBOOT=yes
— [root@localhost ~]# service network restart
#重启网络服务

3、修改UUID
1)vi /etc/sysconfig/network-scripts/ifcfg-eth0
#删除MAC地址行
2)rm -rf /etc/udev/rules.d/70-persistent-net.rules
#删除网卡和MAC地址绑定文件
3)重启动系统

4、设置虚拟机网络连接方式

三、Linux网络命令

一、网络环境查看命令
1、ifconfig命令
ifconfig命令:查看与配置网络状态命令

2、关闭与启动网卡
ifdown 网卡设备名
#禁用该网卡设备

ifup 网卡设备名
#启用该网卡设备

3、查询网络状态
netstat 选项
选项:
— -t:列出TCP协议端口
— -u:列出UDP协议端口
— -n:不使用域名与服务名,而使用IP地址和端口号
— -l:仅列出在监听状态网络服务
— -a:列出所有的网络连接

netstat -rn
选项:
— -r:列出路由列表,功能和route命令一致

4、route命令
route -n
#查看路由列表(可以看到网关)

route add default gw 192.168.1.1
#临时设定网关

5、域名解析命令
nslookup [主机名或IP]
#进行域名与IP地址解析

注:CentOS 6.x 已经没有nslookup这个工具安装方法

— [root@localhost ~]# nslookup
— > server
#查看本机DNS服务器

二、网络测试命令
1、ping命令
ping [选项] ip或域名
#探测指定IP或域名的网络状况
选项:
— -c 次数:指定ping包的次数

2、telnet命令
telnet [域名或IP] [端口]
#远程管理与端口探测命令

— telnet 192.168.1.119 80

3、traceroute
traceroute [选项] IP或域名
#路由跟踪命令
选项
— -n 使用IP,不使用域名,速度更快

4、wget命令
wget http://soft.vpser.net/lnmp/lnmp1.1-full.tar.gz
#下载命令

5、tcpdump命令
tcpdump -i eth0 -nnX port 21
选项:
— -i:指定网卡接口
— -nn:将数据包中的域名与服务转为IP和端口
— -X:以十六进制和ASCII码显示数据包内容
— port:指定监听的端口