Shell基础

shell是一个命令行解释器,用于接收用户(应用程序)命令来调用系统内核。

  • 脚本格式:#!/bin/bash开头(指定解析器)

  • 执行方式:

    • 1.bash/sh + 绝对路径(相对路径)

    • 2.绝对路径(相对路径)

      需要可执行(x)权限

    • 3.source + 绝对路径(相对路径): 在当前的shell下执行

子shell:在子shell中设置的当前的环境变量,对于父shell不可见

1.变量

1.1 常用系统变量

常用系统变量:$HOME、$PWD、$USR、$SHELL、$PATH

env: 列出当前 shell 的所有环境变量

set: 显示所有 shell 变量(包括环境变量和局部变量)

printenv+环境变量名: 输出某个环境变量的值

$PATH: 保存了搜索系统命令的路径(/usr/bin)

1.2 自定义变量

自定义变量(局部变量):变量名=变量值(等号前后不能有空格)

局部变量导出为全局变量:export + 变量名

注:在子shell中修改全局变量对父shell不可见

只读变量:readonly 变量名=变量值

撤销变量:unset + 变量名

注1:在bash中,变量默认的类型都是字符串类型,无法直接进行数值计算。

注2:只读变量不能unset。

1.3 特殊变量

  • $n: n为数字,$0代表脚本名称,$1-$9代表第一到第九个参数,十个以上使用{},如${10}
  • $#: 获取所有输入参数的个数,常用于循环,判断参数的个数是否正确。
  • $*: 获取命令行中的所有参数,并将其看成一个整体
  • $@: 获取命令行中的所有参数,将其看作一个集合

  • $?: 获取上一个命令的返回状态,返回0表示正常结束

2.运算

2.1 运算符

语法格式:$((运算式))$[运算式]

注:(( ))中可用使用数学表达式进行运算

使用expr: a=$(expr 5 \* 2)

2.2 条件判断

  • test +判断条件 : test $a = 2

  • [ 判断条件 ]: “[ ]”前后要有空格

判断条件:

image-20250311151642241

image-20250311151752312

image-20250311152111395

image-20250311152834726

eg:

1
2
3
4
5
6
#判断test文件是否有读的权限
[ -r test ]
#判断8是否小于2
[ 8 -lt 2 ]
#判断目录是否存在
[ -d /home/ubuntu/scripts ]

“[ ]”中的逻辑条件连接使用:-a(and)和-o(or)

2.3 流程控制

if判断

  • 单分支:

    1
    2
    3
    if [ 条件判断 ];then
    程序
    fi
  • 双分支:

    1
    2
    3
    4
    5
    if [ 条件判断 ];then
    程序1
    else
    程序2
    fi
  • 多分支:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    if [ 条件判断1 ]
    then
    程序1
    elif [ 条件判断2 ]
    then
    程序2
    else
    程序3
    fi

for循环

用法一:

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

eg:

1
2
3
4
5
6
7
#!/bin/bash
sum=0
for (( i=1 ;i <= $1; i++))
do
sum=$[ $sum + $i ]
done
echo sum=$sum

用法二:

1
2
3
4
for 变量 in 值1 值2 值3...
do
程序
done
1
2
3
4
5
6
7
#!/bin/bash
sum=0
for i in {1..100}
do
sum=$[$sum + $i]
done
echo sum=$sum

while循环

1
2
3
4
while [条件判断式]
do
程序
done

2.4 Read读取控制台的输入

image-20250311163511274

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

# 设置超时时间为 5 秒
read -t 5 -p "请在 5 秒内输入您的名字: " name

# 检查用户是否输入
if [ -z "$name" ]; then
echo "您未在规定时间内输入名字。"
else
echo "您好, $name! 欢迎使用本脚本。"
fi

2.5 函数

系统函数

data +%s: 输出时间戳

basename 路径 [后缀]: 用于从文件路径中提取文件名或目录名,去除路径前缀和后缀

dirname 路径: 用于从文件路径中提取目录部分,即去掉文件名,返回路径的父目录。

自定义函数

1
2
3
function 函数名() {
函数体
}
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
function add() {
s=$[$1 + $2]
echo $s
}

read -p "输入第一个数" a
read -p "输入第二个数" b
sum=$(add $a $b)
echo "和:"$sum

注:不使用$?接受返回值,$?接收的范围为[0~255]

2.6 正则表达式

  • 常规匹配: 匹配常规字符”xxxx”

    1
    cat /etc/passwd | grep xxxx
  • 模糊匹配:

    • ^: 匹配一行的开头

      1
      2
      #匹配所有以a开头的行
      cat /etc/passwd |grep ^a
    • $: 匹配一行的结束

      1
      2
      #匹配所有以a结束的行
      cat /etc/passwd |grep a$
    • .: 匹配任意的字符

      1
      2
      #匹配所有r..t的行
      cat /etc/passwd |grep r..t
    • *: 不单独使用,与上一个字符连用,表示匹配上个字符的0次或多次

      1
      2
      #匹配rt,rot,root,rooot等所有行
      cat /etc/passwd |grep ro*t
1
2
#匹配以a开头,bash结尾,中间为任意字符的所有行
cat /etc/passwd |grep ^a.*bash$
  • [ ]: 匹配某个范围内的字符

image-20250311195601295