day15shell

Shell基础

一、Shell概念

Shell是操作系统的外壳,可以通过Shell命令来操作和控制操作系统,例如Linux中的Shell命令包括ls、cd、pwd等。Shell是一个在内核基础上编写的应用程序,它连接了用户和Linux内核,使用户能够更加便捷、高效、安全地使用Linux内核。专业术语来说,Shell是一个命令解释器,通过接受用户输入的Shell命令来启动、暂停、停止程序运行或对计算机进行控制。

二、Shell脚本

Shell脚本是由Shell命令组成的执行文件,将一些命令整合到一个文件中,处理业务逻辑。脚本无需编译即可运行,可以减轻工作量,提高工作效率。还可以批量、定时处理主机,方便管理员进行设置或管理。

示例:

[root@wang ~]# vim helloworld.sh

#!/bin/bash

echo "hello world!"

[root@wang ~]# bash helloworld.sh

hello world!

[root@wang ~]# sh helloworld.sh

hello world!

[root@wang ~]# source helloworld.sh

hello world!

[root@wang ~]# chmod +x helloworld.sh

[root@wang ~]# ./helloworld.sh

hello world!

安装Nginx的Shell脚本示例:

[root@wang ~]# vim /root/shell/install_nginx.sh

#!/bin/bash

yum -y install gcc gcc-c++ make pcre-devel openssl-devel wget

cd /usr/local/src/

wget 'https://nginx.org/download/nginx-1.22.1.tar.gz'

tar xf nginx-1.22.1.tar.gz

cd nginx-1.22.1

./configure --prefix=/usr/local/nginx

make -j 4

make install

[root@wang shell]# bash install_nginx.sh

变量

一、概念

变量用于存储系统或用户所需的特定参数或值,其值可根据用户设定或系统环境变化而相应变化。在Shell脚本中使用变量可使脚本更灵活,适应性更强。与变量相对应的是常量,如"Hello World",其值不可改变。

二、变量注意事项

  1. 变量命名规则:由大小写字母、下划线、数字组成,首字母不能是数字。建议命名时简述变量用途。
  2. 变量值类型:整型、浮点型、字符串型、布尔型等,Shell默认变量类型为字符串,无需指定类型。
  3. 使用`env`命令查看所有环境变量。

三、位置变量

通过命令行为脚本程序传递参数,位置变量$n(n为1~9之间的数字)表示脚本要处理的第n个参数。$0表示命令名或脚本名称。

四、预定义变量

Bash中内置的一类变量,不能直接修改。如$*表示所有参数作为整体,$@表示单个参数的组合,$0保存脚本名称,$?保存命令或脚本的执行状态码,$#保存脚本要处理的参数个数。

五、变量的定义与输出

  1. 定义新变量:格式为变量名=变量值,注意变量名以字母或下划线开头,区分大小写。
  2. 变量符号运用:双引号允许通过$符号引用其他变量值,单引号禁止引用其他变量值,$视为普通字符,反撇号或$()用于命令替换。
  3. 输入和输出:输入格式为`read [-p "显示的提示信息"] 变量名`,输出格式为`echo $变量名`。

六、变量的作用范围

默认情况下,新定义的变量仅在当前Shell环境中有效,称为局部变量。进入子程序或新的子shell时,局部变量无法再使用。通过`export`内部命令将指定的变量导出为“全局变量”,使其在所有子Shell环境中继续使用。

七、变量的数学运算

整数运算:格式为`expr 变量1 运算符 变量2 运算符 变量3...`,运算符包括+、-、*、/。

[root@wang shell]# vim test001.sh

#!/bin/bash

echo $1

echo $2

echo $3

echo $4

echo $5

[root@wang shell]# bash test001.sh 1 2 3 4 5

1

2

3

4

5

[root@wang shell]# vim yonghu.sh

#!/bin/bash

useradd $1

echo $2 | passwd --stdin $1

[root@wang shell]# bash yonghu.sh www ww

更改用户 www 的密码 。

passwd:所有的身份验证令牌已经成功更新。

[root@wang shell]# vim s01.sh

#!/bin/bash

for x in "$*"

do

 echo $x

done

[root@wang shell]# bash s01.sh 1 q 2 w 3 e

1 q 2 w 3 e

[root@wang shell]# vim wang.sh

#!/bin/bash

read -p "输入网址" weburl

ping -c 3 $weburl &> /dev/null

if [ $? -eq 0 ]; then

  echo "网络畅通"

else

  echo "网络不通"

fi

[root@wang shell]# sh wang.sh

输入网址www.baidu.com

网络畅通

[root@wang shell]# vim zifu.sh

#!/bin/bash

read -p "请输入账号" user

echo $user

if [ $user == "admin" ]; then

  echo "欢迎登陆: $user"

else

  echo "账号或密码错误"

fi

[root@wang shell]# bash zifu.sh

请输入账号admin

admin

欢迎登陆: admin

[root@wang shell]# vim rpm1.sh

#!/bin/bash

rpm -qa | grep nginx

if [ $? -eq 1 ]; then

 yum -y install nginx

else

 yum -y remove nginx

 yum -y install nginx

fi

[root@wang shell]# bash rpm1.sh

数字判断

一、格式

  1. eq:equal,等于,一般用于 `[ $? -eq 0 ]`,也就是判断上条命令返回值等于 0,直接数字与数字也可以使用 -eq 表示等于。
  2. ne:not equal,不等于,一般用于 `[ $? -ne 0 ]`,判断上条命令返回值不等于 0。
  3. gt:greater than,大于。
  4. ge:greater or equal,大于或等于。
  5. lt:less than,小于。
  6. le:less or equal,小于或等于。

二、字符串判断

1、格式

`[ 字符串1 == 字符串2 ]` 字符串内容相同。

`[ 字符串1 != 字符串2 ]` 字符串内容不同。

`[ -z 字符串 ]` 字符串内容为空。

`[ -n 字符串 ]` 字符串内容不为空。

三、文件、目录、权限的判断

1、格式

`[ 操作符 文件或目录]`

常用的测试操作符:

-e "文件目录或自定变量" 判断文件或目录是否存在 exists。

-f "文件目录或自定变量" 判断是否为文件 isfile。

-d "文件目录或自定变量" 判断是否为目录 isdirect。

-w "文件目录或自定变量" 判断是否可写 w。

-r "文件目录或自定变量" 判断是否可读 r。

-x "文件目录或自定变量" 判断是否可执行 x。

-s "文件目录或自定变量" 判断文件大小,非0时为真 (若为非空文件,则为真) size。

-z "文件目录或自定变量" 判断变量参数值是否为空,为空为真,非空为假 zore。

四、与或判断

判断多个条件

多个条件其中一个成立,或运算判断:|| 或,两个条件满足其一即可,还有-o。

多个条件都要成立,与运算判断:&& 与,两个条件都得满足才行,还有&。

[root@localhost test]# vim yu.sh

#!/bin/bash

read -p "请输入一个数值:" age

if [ $age -gt 30 ] && [ $age -lt 80 ]; then # 这两个条件都得满足,大于30且小于80,可使用[ $age -gt 30 -a $age -lt 80 ]

  echo "age>30 and age<80"

  echo "working"

else

  echo "in else"

fi

[root@localhost test]# sh ./yu.sh

请输入一个数值:60

age>30 and age<80

working

[root@localhost test]# sh ./yu.sh

请输入一个数值:90

in else

七、多重判断语法 elif

if 条件1; then

  #命令,条件1成立执行

elif 条件2; then

  #命令,条件1不成立,条件2成立执行

elif 条件3; then

  #命令,条件1不成立,条件2不成立,条件3成立执行

else

  #命令,以上条件都不成立执行

fi

五、多重判断的 case 语句

1、case 语句概述

case 语句是多分支选择语句,使用case语句改写if多分支可以使脚本结构更加清晰、层次分明。针对变量的不同取值,执行不同的命令序列,case还支持正则表达式。

2、case 语句的结构

case $变量名称 in

模式1)

命令序列1

;;

模式2)

命令序列2

;;

*)

默认命令序列

esac

脚本的数学运算

一、for 循环

1、作用

读取不同的变量值,以逐个执行同一组命令。

2、结构

for 变量名 in 取值列表(范围)

do

命令序列

done

取值列表可以是数字范围、字符串、多个字符串、提前设定好的变量等。for默认以所有的空白字符进行分隔:tab、空格、回车,去循环处理。分割成几段就循环几次。

[root@localhost test]# vim quzhi.sh

#!/bin/bash

for home in 北京 上海 ⼴州 深圳 # home变量在北京、上海、广州、深圳这四个地名中间循环一次

do

echo "$home 是个好地方!"

done

[root@localhost test]# bash quzhi.sh

北京 是个好地方!

上海 是个好地方!

⼴州 是个好地方!

深圳 是个好地方!

二、while 循环

1、作用

重复测试某个条件,只要条件成立则反复执行。

2、结构

while 条件测试操作

do

命令序列

done

3、while和for区别

while循环也有条件判断,当条件成立的时候,会循环执行。当条件不成立退出。if判断当条件成立时,会执行一次,然后退出。当条件不成立时直接退出。

示例脚本(九九乘法表):

[root@localhost test]# vim 99.sh

#!/bin/bash

for i in {1..9}; do

    for j in {1..9}; do

        echo -n "$j*$i=$(($i*$j)) "

        if [ $j == $i ]; then

            echo -e '

'

            break

        fi

    done

done

[root@localhost test]# bash 99.sh

1*1=1

1*2=2 2*2=4

1*3=3 2*3=6 3*3=9

1*4=4 2*4=8 3*4=12 4*4=16

...

sed流式编辑器

一、概述

sed是文本处理工具,读取文本内容,根据指定条件进行处理,可实现增删改查的功能。sed依赖于正则表达式。

1、格式

sed '过滤+动作' 文件路径

2、选项

-e 指定要执行的命令 (操作),只有一个编辑命令 (操作) 时可省略。

-n 只输出处理后的行,读入时不显示,不对原文件进行修改。

-i 直接修改源文件,不输出结果。

二、编辑命令格式

'/地址 1,地址 2/操作(参数)'

1、地址

可为行数、正则表达式、$,没有地址代表全文。

2、操作

p 打印(输出)

d 删除(整行)

s 替换(字符串匹配)

c 替换(整行)

r 读取指定文件(追加到行后)

a (append)追加到指定内容到行后

i (insert)追加指定内容到行前

w 另存为

n 表示读入下一行内容

H 复制到剪贴板

g 将剪贴板中的内容覆盖到指定行

G 将剪贴板中的内容追加到指定行后

示例:

[root@localhost test]# sed -n '12p' test.txt # 输出第12行内容

HELLO

[root@localhost test]# sed -n '3,5p' test.txt # 输出3~5行内容

good

goood

gooood

...

三、sed 命令引用变量

1. sed命令使用单引号的情况下,可以使用 '"$var"' 引用(单引号,然后双引号,变量):

sed -i '2s/node_base/'"$i"'/' /etc/libvirt/qemu/$i.xml

1. sed命令中使用双引号的情况下,直接 shell command 或者 $(shellcommand) 引用命令执行。

sed -i "2s/node_base/$i/" /etc/libvirt/qemu/$i.xml

#!/bin/bash

# 备份

cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak

read -p "请输入指定ip地址:" ip

# 替换dhcp 为 none

sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33

# 在文档最后添加5行

[root@wang shell]# vim initserver.sh

# IPADDR

#!/bin/bash

# 备份

cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak

read -p "请输入指定ip地址:" ip

# 替换dhcp 为 none

sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33

# 在文档最后添加5行

# IPADDR

sed -i '$aIPADDR='"$ip"'' /etc/sysconfig/network-scripts/ifcfg-ens33

# NETMAST

sed -i '$aNETMASK=255.255.255.0' /etc/sysconfig/network-scripts/ifcfg-ens33

# GATEWAY

sed -i '$aGATEWAY=10.1.1.2' /etc/sysconfig/network-scripts/ifcfg-ens33

# DNS1

sed -i '$aDNS1=8.8.8.8' /etc/sysconfig/network-scripts/ifcfg-ens33

# DNS2

sed -i '$aDNS2=114.114.114.114' /etc/sysconfig/network-scripts/ifcfg-ens33

# 修改uuid

# 修该主机名称

read -p "请输入主机名称" hn

hostnamectl set-hostname $hn

# 停用selinux

setenforce 0

sed -i '/SELINUX=enforcing/cSELINUX=disabled'  /etc/selinux/config

# 停用防火墙

systemctl stop firewalld

systemctl disable firewalld

# 停用NetworkManage

systemctl stop NetworkManager

systemctl disable NetworkManager

# 重启网络服务

systemctl restart netword

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值