window.cnblogsConfig = { webpageTitleOnblur: '404-页面丢失', } window.cnblogsConfig = { webpageTitleOnblurTimeOut: 500, }

shell

一、shell概述

1.1 什么是shell

shell:命令解释器(bash、zsh、cmd、xshell等)

image-20241125201332461

1.2 shell种类

bsh:起源于贝尔实验室的shell
csh:起源于加利福尼亚大学,使用C语言语法风格,命令行交互方便
ksh:起源于贝尔实验室,结合了bsh和csh的优点
bash:bsh的升级版,吸取了ksh的特点,目前最广泛的,但不是最好的
zsh:兼具了各种shell的优点,可以自行安装yum install zsh -y

一般在/bin或者/usr/bin的目录下

1.2 如何查看当前shell环境

  • 查看当前系统支持的shell环境
cat /etc/shells
  • 查看当前正在使用的shell环境
echo $SHELL

二、bash基本功能

2.1 管道符

作用:将前面命令的输出结果,作为后面命令的输入

2.2 历史记录

history		#默认记录1000条
!历史数组	#执行指定数字的历史记录命令
!命令字	#执行历史上最近一次的指定命令
history -c	#删除历史记录

2.3 重定向符号

输出重定向
> 将命令的标准输出重定向到指定文件中,覆盖原有内容
>>将命令的标准输出追加到指定文件中
-----------------------------------------------
> 相当于 1>	#正确的结果
2>			  #错误的结果
&>			  #正确和错误结果
配合/dev/null使用
输入重定向
<	#将指定文件的内容作为命令的标准输入

脚本怕交互卡壳

passwd --stdin 用户名 < /路径/pass.txt
echo "密码" | passwd --stdin 用户名
#两个语句效果等同

2.4 awk

作用:过滤行和列

命令 | awk '/关键词/'		#以关键字过滤行
命令 | awk '{print $n}'	  #以空格为分隔符,选中第n个内容(过滤列)
命令 | awk '/关键字/{print $n}' #组合使用
awk -F: '{print $n,$m}'		#以:为分隔符,选中第n个和低m个内容

2.5 逻辑符

  • a && b:a执行成功后,才会执行b
  • a || b:a执行失败后,才会执行b
  • a ; b:连接两条命令,无论a执行成功与否,都会执行b

三、shell脚本(bash为例)

什么是脚本:批量的执行命令

作用:简化重复的工作

3.1 基本步骤

  1. 创建脚本

    touch test.sh
    
  2. 赋予执行权限

    chmod a+x test.sh
    
  3. 编辑脚本

    vim test.sh
    
  4. 执行脚本

    ./test.sh
    

3.2 执行脚本的方法

  • ./脚本名 子shell环境中执行--环境变量目录或当前目录中的脚本
  • 绝对路径/脚本名 子shell环境中执行--绝对路径下的脚本
  • . /路径/脚本名 当前shell环境下执行--结合前两种路径下的脚本 (空格+.)

3.3 变量

变量类型

  1. 自定义变量
  2. 环境变量
  3. 位置变量
  4. 预定义变量

3.3.1 自定义变量

赋值

varName=Value	#等号两边不能有空格
export varName=Value	#定义全局变量

变量名设置规则

  • 数字、字母、下划线组成,不能使用特殊符号
  • 区分大小写
  • 不能以数字开头
  • 等号两边不能有空格

调用变量

  • $变量名
  • 其他字符串$变量名
  • ${变量名}其他字符串 添加{}区别变量名和其他字符串

互动赋值

read varName
read -p "输入提示" varName 

变量存储命令执行结果

varName=`命令`

先执行命令,后将命令执行结果赋值给varName

变量引用

在bash中,有些字符具有特殊含义,如果需要忽略这些字符的特殊含义,就必须使用引用技术。

  1. 使用转义字符\
  2. 强引用:使用单引号‘’,单引号中的字符都作为普通字符使用,不能套用
  3. 弱引用:使用双引号“”,双引号中的部分字符仍保留特殊含义
    • $-变量扩展
    • `-命令替换
    • \-禁止单个字符扩展

删除变量

unset varName

列出所有变量

set
set | grep varName

变量升级:全局变量

所有父子shell环境都可以使用的变量

export varName
export vaeName=Value

3.3.2 环境变量

自定义变量的一种,但是经常被调用,且与系统环境、背景有关系

变量名 含义
HOME 用户主目录
LOGNAME 登录名
USER 用户名,与登录名相同
PWD 当前目录/工作目录名
MAIL 用户的邮箱绝对路径
HOSTNAME 主机名
INPUTRC 默认的键盘映像
SHELL 用户使用的shell路径名
LANG 默认语言
HISTSIZE history命令最大条数
PATH 环境目录列表
PS1、PS2 shell一级、二级命令提示符

3.3.3 位置变量

./执行脚本 varName1 varName2 ...

eg:

touch test.sh
chmod a+x test.sh
vim test.sh
#!/bin/bash
echo 当前执行的脚本名$0
echo 第一个位置变量$1
echo 第二个位置变量$2

image-20241126103211789

3.3.4 预定义变量

bash预定义好的一类特殊变量

$?		#返回上一条命令的结果状态。0为成功;非0为失败
$*		#返回所有位置变量的值
$#		#返回所有位置变量的个数
$0		#脚本本身,也是位置变量

3.4 判断语句

3.4.1 if语句

  • 单分支

    if 判断条件
      then
        条件成立执行语句
    fi
    
  • 双分支

    if 判断条件
      then
        条件成立执行语句
    else
      条件不成立时执行语句
    fi
    
  • 多分支

    if 判断条件1
      then
        条件1成立执行语句
    elif 判断条件2
      then
        条件2成立执行语句
    else
      条件1、2都不成立时执行的语句
    fi
    

判断条件

  • 数值比较

    [ number1 -eq number2 ]
    -eq		#等于
    -ne		#不等于
    -gt		#大于
    -ge		#大于等于
    -lt		#小于
    -le		#小于等于
    
  • 字符串比较

    [ "String1" = "String2" ]
    =		#等于
    !=		#不等于
    -z		#是否为空
    
    eg:
    [ $LANG = "en.US.UTF-8" ]
    
    a=""
    [ -z $a ]
    echo $?
    

    配合使用:

    [ $USER = "root"] && echo "the user is 超级用户" || echo "the user is 普通用户"
    
  • 文件或目录判断

    !		#取反
    -d		#是否为目录
    -f		#是否为文件
    -e		#是否存在
    -r		#当前用户是否有读权限
    -w		#当前用户是否有写权限
    -x		#当前用户是否有执行权限
    
    eg:
    [ -d /root ]  #判断/root是否为文件夹
    echo $?
    

3.4.2 case语句

case 变量 in
 情况1)
   语句
   ;;
 情况2)
   语句
   ;;
 情况3)
   语句
   ;;
 *)
   语句
   ;;
esac

3.5 循环语句

3.5.1 For循环

for varName in varName取值范围
do
    循环语句
done
  • for i in {1..100}

    #!/bin/bash
    for i in {30..39}
    do
      echo -e "\033[${i}mok\033[0m"
    done
    

    image-20241126155434589

  • for file in *.zip

    #!/bin/bash
    for file in *.zip
    do
      unzip "$file"
    done
    
    #!/bin/bash
    for file in *.tar.gz
    do
      tar -xf "$file"
    done
    
  • for user in $*

    #!/bin/bash
    for user in $*
    do 
      /usr/sbin/useradd $user &>/dev/null
      echo "password" | passwd --stdin $user &>/dev/null
    done
    echo "The users $* is added successfully! total is $#"
    

    image-20241126162817138

3.5.2 while循环

while 判断条件
  do
    成立时执行语句
  done

自增

let i++
let i+=1
let i--
let i-=1
let i*=1

3.6 颜色

echo -e "\033[背景颜色数字;字体颜色数字m变色内容\033[0m"

image-20241126110445889

字体背景颜色范围40-49
40:黑色
41:红色
42:绿色
43:黄色
44:蓝色
45:紫色
46:青色
47:白色
字体颜色范围30-39
30:黑色
31:红色
32:绿色
33:黄色
34:蓝色
35:洋红色
36:青色
37:白色

3.7 其他

echo不换行显示

echo -n "不换行"

ping

ping -c2 -i0.2 ip
#间隔为0.2秒 pingIP地址两次

多进程

  1. 将重复调用的代码写成函数
  2. 调用函数时加&,表示

四、源码安装软件脚本案例

4.1 源码安装

源码安装步骤:

  1. 解压:.tar.gz文件

    tar -xf **.tar.gz
    
  2. 预编译

    ./cinfigure 指定安装路径,建议指定启动用户

  3. 编译

    make

  4. 编译安装

    make、install


目标:通过脚本完成,⼀键安装源码包nginx,整个安装过程不显示在屏幕上,通过⽕狐浏览器直接看本机启动后的httpd服务的欢迎页面

前提:源码包已解压缩,且在文件夹内启动脚本

#!/bin/bash

#创建程序用户 -u1000以内表示程序用户 -M不需要家目录 -s指定shell
useradd -u 250 -M -s /sbin/nologin nginx &>/dev/null
echo "Nginx程序⽤户nginx已经成功创建"

#使用config脚本⽣成makefile⽂件
echo "正在预编译-指定安装路径"
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &> /dev/null

#编译和安装
echo "正在进⾏编译和安装"
make &>/dev/null && make install &>/dev/null

#启动nginx服务
/usr/local/nginx/sbin/nginx &>/dev/null
echo "Nginx服务启动完毕"

#启动⽕狐浏览器验证 
echo "正在为您打开浏览器测试⽹⻚"
firefox http://127.0.0.1 &>/dev/null &

4.2 联动systemctl脚本

usr/lib/systemd/system/:存储所有服务脚本的路径,可以被systemctl程序识别的服务

#!/bin/bash

#服务名称
name=nginx
#安装路径
rout=/usr/local/nginx/sbin/nginx
#服务reload命令参数
rel="-s reload"
#服务stop命令参数
st="-s stop"

echo "[Unit]
Description=The ${name}
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
Environment=LANG=C

ExecStart=${rout}
ExecReload=${rout} ${rel}
ExecStop=${rout} ${st}

KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target" >/usr/lib/systemd/system/${name}.service 

#systemctl重新加载配置文件
systemctl daemon-reload
posted @ 2024-11-27 19:59  憂心如惔  阅读(71)  评论(0)    收藏  举报