linux之Shell

201889

0:31

 

 

1、查看linux支持的Shell

   cat /etc/shells

 

2、执行脚本文件(3种方法:)

   方法一:脚本文件路径(需要执行权:x权限)

例如:

      cd /root

 

      vi first.sh

      cd /boot/

      pwd

      ls -lh vml*

 

      chmod  +x  first.sh(赋予first.sh脚本文件执行权)

 

              ./first.sh  

 

 

   方法二:sh  脚本文件路径

 例如:

vi server.sh

        service $1 start

 

sh server.sh crond(crond为服务名)

 

   方法三:source  脚本文件路径

例如:

source server.sh crond

3、重定向:

交互式设备:

    标准输入:键盘(默认)     /dev/stdin(设备文件)          0(编号)

    标准输出:显示器(默认)   /dev/stdout(设备文件)          1(编号)

    错误输出:显示器(默认)   /dev/stderr(设备文件)          2(编号)

重定向类型:

    输入重定向:<        (从文件读取数据)

    标准输出(正确结果)重定向:

>        (将输出结果保存至文件,并覆盖原内容)

>>        (将输出结果追加至原内容的末尾处)

    错误输出(正确结果)重定向

2>        (将输出结果保存至文件,并覆盖原内容)

2>>        (将输出结果追加至原内容的末尾处)

    混合输出(正确、错误)重定向:

&>        (将输出结果保存至文件,并覆盖原内容)

&>>        (将输出结果追加至原内容的末尾处) 

4、管道符操作

例如:

grep “bash$” /etc/passwd | awk  -F:  ‘{print $1,$7}’

(awk用于截取输出内容,-F为指定分隔符,例子中的分隔符为冒号)

(print为打印输出,$1,$7为位置变量,表示:第1列和第7列)

(整个命令结果是只显示原屏幕的:第1列和第7列的内容)

 

5Shell变量:

1)变量的类型

    自定义变量:由用户自己定义、修改和使用

    环境变量:由系统维护,用于设置工作环境

    位置变量:通过命令行给脚本程序传递参数

    预定义变量:Bash中内置的一类变量,不能直接修改

 

2)定义变量:变量名=变量值

 (变量名以字母或下划线开头,区分大小写,建议全大写)

 

3)查看变量的值:echo  $变量名

 

例如:

                     Product=AIX

                     Version=1.0

                     echo $Product

                    echo $Product $Version

4)赋值时使用引号

双引号:允许通过$符号引用其他变量值

单引号:禁止引用其他变量值,$视为普通字符

反撇号:命令替换,提取命令执行后的输出结果

 

例如:

num1=100

num2=200

num3="$num2"

num4='$num2'

LS=`ls /root`

 

echo $num3

echo $num4

echo $LS

 

5)从键盘输入内容为变量赋值

                 格式: read  [-p  "提示信息"]  变量名

 

例如:

read  NAME(无友好提示,不知道该输入什么内容)

(从键盘输入的内容赋值给变量NAME)

 

read  "请输入您的姓名"  NAME(有提示,提示内容为:请输入您的姓名)

(从键盘输入的内容赋值给变量NAME)

 

6)设置变量的作用范围

格式1:export   变量名 ...(提升已有变量为全局变量)

格式2: export  变量名=变量值  ...(定义新变量的同时,提升其为全局变量)

 

例如:

Product=AIX

                     Version=1.0

export Product

 

bash

                     echo $Product(输出结果为:AIX)

                    echo $Version(输出结果为:空)

exit

 

7)整数变量的运算

格式:expr  变量1   运算符  变量2  [运算符 变量3] ...

 

   常用运算符

加法运算:+

减法运算: -

乘法运算: \*

除法运算: /

求模(取余)运算: %

 

例如:

num1=100

num2=200

sum1=`expr  $num1  +  $num2`

product1=`expr  $num1  \*  $num2`

echo  $sum1  $product1

也可以:

sum2=$((num1+num2))

product2=$((num1*num2))

echo  $sum2  $product2

 

8)环境变量

由系统提前创建,用来设置用户的工作环境

配置文件:

         /etc/profile:定义全局的系统环境变量

 

~/.bash_profile(定义不同用户的环境变量,该文件具有隐藏属性)

 

例如:

ls  /root(无法找到.bash_profile文件,文件处于隐藏状态)

ls   -a  /root(-a选项,也可以-A,都可以看到隐藏文件)

 

(前面带点的文件或目录,就自动具有隐藏属性)

(我们也可以自己创建带点的文件或目录)

 

常见的环境变量:

PWD(定义工作路径)、PATH(命令的搜索路径)

USER(定义登录的用户名) 、SHELL(定义shell)、HOME(定义家目录)

 

例如:

echo $PATH(查看显示结果)

 

PATH="$PATH:/root"

echo $PATH(再次查看显示结果,前后对比)

 

9)位置变量:表示为 $nn1~9之间的数字

 

例如:

cd  /root

vi  copy.sh

#!/bin/bash

cp $1 $2

 

 

 

chmod  +x  copy.sh

./copy.sh  /etc/yum.conf  /root

(脚本中的位置变量$1的值为:/etc/yum.conf,$2的值为:/root)

 

10)预定义变量

$#:命令行中位置变量的个数

$*:所有位置变量的内容

$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错

$0:当前执行的进程/程序名

 

例如:

cd  /root

vi  mybak.sh

#!/bin/bash

TARFILE=beifen-`date +%s`.tgz

tar zcf $TARFILE $* &> /dev/null

echo "已执行 $0 脚本,"

echo "共完成 $# 个对象的备份"

echo “具体内容包括: $*”

 

./mybak.sh  /etc/passwd  /etc/shadow (查看结果)

10)脚本应用思路

第一:具体命令、及其执行顺序

第二:组织任务过程 编写脚本

第三:设置计划任务(控制时间tab,调用任务脚本)

Crontab -e

30 2 * * * /bak.sh(脚本或目录命令)

分 小时 日 月 年

Service crond start 计划任务服务开启

 

Shell 逻辑命令

201889

11:39

 

Test 命令

测试特定的表达式是否成立,如果成立返回0值,不成立返回1.

格式1:test  条件表达式

格式2:[  条件表达式  ]

-d:测试是否为目录(Directory

-e:测试目录或文件是否存在(Exist

-f:测试是否为文件(File

 -r:测试当前用户是否有权限读取(Read

-w:测试当前用户是否有权限写入(Write

-x:测试当前用户是否有权限执行(eXcute

 

逻辑测试

格式1表达式1  ]  操作符  [  表达式2  ]  ...

格式2:命令操作符  命令2  ...

 

常用的测试操作符

-a&&:逻辑与,而且的意思

-o||:逻辑或,或者的意思

!:逻辑否

 

 

常用的测试操作符

=:字符串内容相同

!=:字符串内容不同,! 号表示相反的意思

 -z:字符串内容为空

 

例如:

[root@localhost ~]# Str1="abc"

[root@localhost ~]# Str2="ABC"

[root@localhost ~]# [ $Str1 = $Str2 ] && echo YES || echo NO

NO

 

[root@localhost ~]# [ $Str1 != $Str2 ] && echo YES || echo NO

YES

 

[root@localhost ~]# [ -z $Str2 ] && echo YES || echo NO

NO

 

[root@localhost ~]# [ -z "" ] && echo YES || echo NO

YES

 

 if 条件测试

if

then

elif

then

           else

fi

 

 

 for

 for 变量名 in 取值列表

 do

命令序列

done

 

 

 

while 条件测试操作

do

命令序列

done

例:

linux之Shell_第1张图片

 

case

case 变量值 in

模式1)

命令序列1

;;

模式2)

命令序列2

;;

….

*)(表示通配)

默认命令序列

esac

 

 

例:

linux之Shell_第2张图片

 

linux之Shell_第3张图片

 

 

、程序案例:

   案例一:判断磁盘已用空间比例

linux之Shell_第4张图片

输出结果

 

 

 

 

 

 

案例二:判断Httpd服务是否开启

#!/bin/bash

 

netstat -anpt | grep httpd &> /dev/null

if [ $? -eq 0 ]

then

                            echo "Httpd服务已经启动!"

else

                            rpm -q httpd &> /dev/null

 

                            if [ $? -eq 0 ]

                            then

                                          service  httpd  start

                            else

                                        mount /dev/cdrom /mnt

                                        rpm -ivh /mnt/Packages/httpd-2.2.15-29.el6_4.x86_64.rpm

                            fi

fi

 

案例三:根据输入的成绩值,判断等级

linux之Shell_第5张图片

输出结果

 

案例四:网络连通性测试

linux之Shell_第6张图片

结果

 

案例五:从IP地址列表文件中,测试主机的连通性

 

 

 

 

 

 

 

 

 

 

 

 

 

 

案例六:批量创建100个用户,用户名为stu开头字符串开头,后跟1-100的编号,初始密码均为:123456

#!/bin/bash

for((i=1;i<=100;i++))

do

                                useradd stu$i &> /dev/null

                         echo "123456" | password --stdin stu$i

done

 

 

案例七:批量创建用户,用户名从文件列表中获取,初始密码均为:123456

#!/bin/bash

 

UserList=$(cat /root/userlist.txt)

 

for User in $UserList

do

                                useradd $UserList &> /dev/null

                         echo "123456" | password --stdin $UserList

done

 

 

案例八:统计1-100之和

#!/bin/bash

sum=0

for((i=1;i<=100;i++))

do

                          sum=$((sum+i))

done

 

echo $sum

 

 

案例九:        猜价格游戏

 

linux之Shell_第7张图片

 

 

案例10:MySQL数据库备份脚本

 

#!/bin/bash

# 这是一个简化的MqSQL数据库逻辑备份脚本

# 1.定义数据库链接,目标库信息

MY_USER="operator"

MY_PASS="pwd123"

MY_HOST="192.168.4.11"

MY_CONN="-u $MY_USER -p$MY_PASS -h $MY_HOST"

MY_DB1="studydb"

MY_DB2="coursedb"

# 2.定义备份目录,工具,时间,文件名主体

BF_DIR="/mysql.benfen/"

BF_CMD="/usr/bin/mysqldump"

BF_TIME='date +%Y%m%d-%H%M'

NAME_1="$MY_DB1-$BF_TIME"

NAME_2="$MY_DB2-$BF_TIME"

# 3.先导出为.sql脚本,然后再进行压缩(打包后删除原文件)

cd $BF_DIR

$BF_CMD $MY_CONN --databases $MY_DB1 > $NAME_1.sql

$BF_CMD $MY_CONN --databases $MY_DB2 > $NAME_2.sql

/bin/tar zcf $NAME_1.tar.gz $NAME_1.sql --remove &> /dev/null

/bin/tar zcf $NAME_2.tar.gz $NAME_2.sql --remove &> /dev/null

 

案例11:

#!/bin/bash

 

case $2 in

start)

service $1 start

;;

stop)

service $1 stop

;;

restart)

service $1 stop

service $1 start

;;

status)

service $1 status

;;

reload)

service $1 reload

;;

*)

echo "语法错误!"

echo "service $1 start|stop|restart|status|reload"

esac

 

 

案例12:设置网卡静态IP地址等信息

#!/bin/bash

#获取网卡的设备名称

IFNAME=$(ifconfig | grep "eth" | awk '{print $1}')

 

#获取网卡的MAC地址信息

MAC=$(ifconfig | grep "eth" | awk '{print $5}')

 

#生成网卡设备的配置文件,并重启网络服务,使配置文件生效

echo "DEVICE=$IFNAME

HWADDR=$MAC

TYPE=Ethernet

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.120.120

NETMASK=255.255.255.0

GATEWAY=192.168.120.254

DNS1=8.8.8.8

DNS2=114.114.114.114" > /etc/sysconfig/network-scripts/ifcfg-$IFNAME

 

service network restart

 

案例13:设置网卡静态IP地址等信息(通过键盘输入)

#!/bin/bash

IFNAME=$(ifconfig | grep "eth" | awk '{print $1}')

MAC=$(ifconfig | grep "eth" | awk '{print $5}')

 

read -p "请输入网卡IP地址:" IP

read -p "请输入子网掩码:" MASK

read -p "请输入网关地址:" GW

read -p "请输入首选DNS地址:" DNS1

read -p "请输入备用DNS地址:" DNS2

 

echo "DEVICE=$IFNAME

HWADDR=$MAC

TYPE=Ethernet

ONBOOT=yes

BOOTPROTO=static

IPADDR=$IP

NETMASK=$MASK

GATEWAY=$GW

DNS1=$DNS1

DNS2=$DNS2" > /etc/sysconfig/network-scripts/ifcfg-$IFNAME

 

service network restart

 

 

案例14:将克隆后的虚拟机网卡设备名称由:eth1、eth2、eth3...改为eth0

 

    思路如下:

 

修改网卡设备名为:eth0

修改下列文件:

/etc/udev/rules.d/70-persistent-net.rules

对原始的eth0所在行加注释:如下所示:

 

#SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:3b:7d:a4", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

 

再将另一个设备名改为:eth0,如下所示:

该行原内容为:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:0f:85:66", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

 

修改后为:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:0f:85:66", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

 

最后,执行重启命令:reboot

 

 

 

#!/bin/bash

#获取网卡的设备名称

IFNAME=$(ifconfig | grep "eth" | awk '{print $1}')

 

#获取网卡的MAC地址信息

MAC=$(ifconfig | grep "eth" | awk '{print $5}')

 

#注释原有的eth0所在行

sed  -i  "/eth0/s/SUBSYSTEM/#SUBSYSTEM"  /etc/udev/rules.d/70-persistent-net.rules

 

#将网卡的新设备名改为:eth0

sed "s/$IFNAME/eth0"  /etc/udev/rules.d/70-persistent-net.rules &> /dev/null

 

 

 

#生成网卡设备的配置文件,并重启网络服务,使配置文件生效

echo "DEVICE=eth0

HWADDR=$MAC

TYPE=Ethernet

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.120.120

NETMASK=255.255.255.0

GATEWAY=192.168.120.254

DNS1=8.8.8.8

DNS2=114.114.114.114" > /etc/sysconfig/network-scripts/ifcfg-eth0

 

service network restart

reboot

 

 

 

linux之Shell_第8张图片

你可能感兴趣的:(inux)