shell --- 基础篇

news2025/2/26 2:59:18

一、符号介绍

$#脚本的参数个数
$*以一个单字符串显示所有脚本传递的参数
$$当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态(或函数的返回值)。0表示没有错误

三、基础语法

echo --- 输出

  • 基本格式
echo "<输出信息>"

 变量定义

  • 基本格式
# 私有变量定义 --- 只有当前脚本可以看到
<变量名>=<变量内容>
delcara <变量名>=<变量内容>

#用户环境变量定义
export <变量名>=<变量内容>

#数组定义
<变量名>=(
    "成员1"
    "成员2"
    "..."
)

printf --- 输出

  • 基本格式
printf <格式化字符串> <参数>
格式指示符描述
%b相对应的参数被视为含有要被处理的转义序列之字符串,见表:转义序列
%cASCII 字符
%d, %i十进制数
%e浮点格式
%E浮点格式
%f浮点格式
%g%e或%f转换, 看哪一个较短,则删除结尾的零
%G%E或%f转换, 看哪一个较短,则删除结尾的零
%o不带正负号的八进制值
%s字符串
%u不带正负号的十进制值
%x不带正负号的十六进制值,使用a至f表示10到15
%X不带正负号的十六进制值,使用A至F表示10到15
%%字面意义%
转义序列描述
\a
\b
\c
\f
\n
\r
\t
\v
\\
\ddd
\0ddd

let --- 整数数学运算

  • 基本格式
let <运算表达式>
  • 示例
#!/bin/bash

let count=0

let count++

let a=${count}+1

echo "count=${count} a=${a}"
  • 运行结果 

function --- 函数

返回值为整数

  • 基本格式
# 函数定义
[function] <函数名>() {
    <入参1>=$1
    <入参2>=$2
    <入参n>=$n
    
    <...>
    return <整数返回值>
}

# 函数调用
<函数名> <参数1> <参数2> <...>
<函数返回值>=$?
函数相关符号描述
$*以一个单字符串显示所有参数
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$0-$n函数的每一个参数,$0表示可执行程序本身,$1表示第一个参数
$?函数运行结果(返回值)
$#参数个数

注:

不省略关键字 function 时,函数名后面的'()' 可以省略

省略关键字 function 时,函数名后面的'()' 不可以省略

  • 示例
#!/bin/bash

function cal_sum1() {
    echo "cal_sum1 params: $@"
   
    let sum=$1+$2
    return $sum
}

cal_sum2() {
    echo "cal_sum2 params: $*"

    let sum=$1+$2
    return $sum
}

cal_sum1 100 20
echo "sum1 100+20=$?"

cal_sum2 100 110
echo "sum2 100+110=$?"
  • 运行结果

 返回值为字符串

  •  基本格式
# 函数定义
[function] <函数名>() {
    <入参1>=$1
    <入参2>=$2
    <入参n>=$n
    
    <...>
    echo "<字符串>"
}

# 函数调用
<返回值变量>=$(<函数名> <参数1> <参数2> <...>)

注:此处获取到返回值,永远是函数中第一个echo输出的字符串 

  • 示例
#!/bin/bash

function test_func() {
    echo "$1"
    echo "is return val ?"
}

result=$(test_func "hello world")
echo "test_func return val=$result"
  • 运行结果

 函数入参为数组

  • 基本格式
# 函数定义
[function] <函数名>() {
    <数组入参>=$1
    <入参2>=$2
    <入参n>=$n
    
    for <成员变量> in ${数组入参[@]}
    do
        <...>
        echo "element=${成员变量}"
    done
    return <整数返回值>
}

<数组变量名>=(
    "成员1"
    "成员2"
    "..."
)

# 函数调用
<函数名> "${数组变量名[*]}" <参数2> <...>
<函数返回值>=$?
  • 示例 
#!/bin/bash

function test_func() {
    list=$1

    for student in ${list[@]}
    do
        echo ${student}
    done 
}

student_list=(
    "xiaoming"
    "zhangsang"
    "xiaozhang"
)

test_func "${student_list[*]}"
  •  运行结果

 if --- 条件判断

  • 基本格式
if [ <条件表达式> ]; then
    <...>
elif [ <条件表达式> ]; then
    <...>
else
    <...>
fi

整数比较

  • 基本格式
if [ <整数> [选项] <整数> ]; then
    <...>
fi
选项描述
-eq等于
-ne不等于
-gt大于
-ge大于等于
-lt小于
-le小于等于

字符串比较

  • 基本格式
if [ "<字符串1>" [选项] "<字符串1>" ]; then
    <...>
fi
选项描述
== 或 =两个字符串相等
!=两个字符串不相等
<字符串1 字典排序在 字符串2前面
>字符串1 字典排序在 字符串2后面

 字符串判断

  • 基本格式
if [ [选项] "<字符串>" ]; then
    <...>
fi
选项描述
-n字符串长度非0,则为真, 也即字符串不为空。-n 可缺省
-z字符串长度为0,则为真, 也即字符串为空。-z 不可缺省

文件判断

  • 基本格式
if [ [选项] <文件或目录> ]; then
    <...>
fi
选项描述
-a文件存在则为真
-d文件为目录且存在为真
-e文件或目录存在时为真
-f文件存在且为一个普通文件则为真
-r文件存在且具有可读权限则为真
-w文件存在且具有可写权限则为真
-x文件存在且具有可执行权限则为真
-b文件存在且是一个块文件则为真
-c文件存在且是一个字符文件则为真
-g文件存在且设置了SGID则为真
-h文件存在且是一个符号符号链接文件则返回为真
-k文件存在且已经设置了冒险位则返回为真
-p文件存并且是命令管道时返回为真
-s文件存在且大小非0时为真则返回为真
-u文件存在且设置了SUID位时返回为真
-O文件存在且属有效用户ID则返回为真
-G文件存在且默认组为当前组则返回为真
-L文件存在且是一个符号连接则返回为真
-N文件存在 and has been mod如果ied since it was last read则返回为真
-S文件存在且是一个套接字则返回为真

文件比较

  • 基本格式
if [ <文件1> [选项] <文件2> ]; then
    <...>
fi
选项描述
-nt如果 文件1 比 文件2 新, 或者 文件1 存在但是 文件2 不存在则返回为真
-ot如果 文件1 比 文件2 老, 或者 文件2 存在但是 文件1 不存在则返回为真
-ef如果 文件1 和 文件2 指向相同的设备和节点号则返回为真

逻辑判断

  • 逻辑非
if [ ! <表达式> ]; then
    <...>
fi
  • 逻辑与 
if [ <表达式> -a <表达式> ]; then
    <...>
fi

if [ <表达式> ] && [ <表达式> ]; then
    <...>
fi
  • 逻辑或 
if [ <表达式> -a <表达式> ]; then
    <...>
fi

if [ <表达式> ] || [ <表达式> ]; then
    <...>
fi

高级特性

数学表达式 --- (())

# 双圆括号(( )):表示数学表达式
# 在判断命令中只允许在比较中进行简单的算术操作,而双圆括号提供更多的数学符号,
# 而且在双圆括号里面的'>','<'号不需要转意。

if (( <数字> [运算符] <数字> ))
运算符含义
>大于
>=大于等于
<小于
<=小于等于
==等于
!=不等于

高级字符串处理 --- [[]]

# 双方括号[[ ]]:表示高级字符串处理函数
# 双方括号中判断命令使用标准的字符串比较,还可以使用匹配模式,
# 从而定义与字符串相匹配的正则表达式。

if [[ <字符串> [运算符] <字符串> [逻辑运算符] <字符串> [运算符] <字符串> ]]

if [[ [运算符] <文件或目录> [逻辑运算符] [运算符] <文件或目录> ]]
运算符含义
=两个字符串相等
!=两个字符串不相等
-n字符串长度非0,则为真, 也即字符串不为空。-n 可缺省
-z字符串长度为0,则为真, 也即字符串为空。-z 不可缺省
-r文件存在且具有可读权限则为真
-l文件存在且是一个符号连接则返回为真
-w文件存在且具有可写权限则为真
-x文件存在且具有可执行权限则为真
-f文件存在且为一个普通文件则为真
-d文件为目录且存在为真
-s文件存在且大小非0时为真则返回为真
-nt如果 文件1 比 文件2 新, 或者 文件1 存在但是 文件2 不存在则返回为真
-ot如果 文件1 比 文件2 老, 或者 文件2 存在但是 文件1 不存在则返回为真
逻辑非
&&逻辑与
||逻辑或

for --- 循环

  • 基本格式
<数组名>=(
    <"...">
)
for <变量> in ${<数组名>[@]}
do
    if [ <表达式> ]; then
        <...>
        continue
    fi

    <...>
    break
done

   或

for ((<赋值表达式>; <条件表达式>; <循环表达式>))  
do  
    if [ <表达式> ]; then
        <...>
        continue
    fi

    <...>
    break
done
  • 示例
array=(
    "xiaoming"
    "zhangsan"
)
for i in ${array[@]}
do
    echo $i
done

for (( i=1; i<3; i++ ))
do
    echo $i
done
  • 运行结果 

 

while --- 循环

  • 基本格式
while [ <表达式> ];  
do  
    if [ <表达式> ]; then
        <...>
        continue
    fi

    <...>
    break
done

  或

while [[ <表达式> ]];  
do  
    if [ <表达式> ]; then
        <...>
        continue
    fi

    <...>
    break
done
  •  示例
#!/bin/bash

let count=0

while [[ $count -le 5 ]];
do
    echo $count
    ((count++))
done
  •  运行结果

until --- 表达式条件取反循环

  • 基本格式
until [ <表达式> ];  
do  
    if [ <表达式> ]; then
        <...>
        continue
    fi

    <...>
    break
done

   或

until [[ <表达式> ]];  
do  
    if [ <表达式> ]; then
        <...>
        continue
    fi

    <...>
    break
done
  • 示例 
#!/bin/bash

let count=8

until [[ $count -le 5 ]];
do
    echo $count
    ((count--))
done
  •  运行结果

case --- 分支

  • 基本格式
case $<变量> in
    <选项>)
        <...>
        break
        ;;
    <...>)
        <...>
        break
        ;;
    *)
        <...>
        break
esac

select --- 选择

  • 基本格式
<选项列表名>=(
    <"选项">
    <...>
)
PS3="提示信息:"
select <变量> in ${<选项列表名>[@]}; 
do 
    <...>
    break; 
done
  • 示例 
// select和case结合

select_list=(
    "xiaoming"
    "xiaozhang"
)
PS3="Please select a student:"
select args in ${select_list[@]}
do
    case $args in
        "xiaoming")
            echo "student is xiaoming"
            break
            ;;
        "xiaozhang")
            echo "student is xiaozhang"
            break
            ;;
        *)
           break
    esac
done
  • 运行结果

四、常用命令介绍

 read --- 读取

  • 基本格式
read [选项] <输入>
选项说明
-a限定输入为数组
-d <结束符号>指定结束符,遇到该字符是立即结束
-e 使用readline处理输入,允许使用和命令行相同的方式编辑输入
-i <文本>如果用户直接按Enter键,使用文本作为默认值,需要配合-e选项使用
-n <num>从输入中读取num个字符,而非读取一整行
-N <num>只在准确读取num个字符后返回,除非遇到EOF或读取超时,忽略任何分隔符。
-p <"提示信息:">     指定输出提示信息
-r反斜杠转义不会生效,意味着行末的’\’成为有效的字符,例如使 \n 成为有效字符而不是换行
-s不显示输入的值,一般用于密码
-t <timeout>指定超时时间,单位:秒
-u fd从文件描述符fd中读取输入

从标准输入读取内容

  • 基本格式
read -p <"提示信息"> <变量>
  •  示例
#!/bin/bash

read -p "请输入:" input

echo $input
  • 运行结果

读取文件内容

while 循环法

  • 基本格式
while read [选项] <变量>
do
    # 默认每次从文件中读取一整行,也可以通过read支持的选项改变默认行为
    <...>
done < <文件>

文件描述符法

  • 基本格式
Exec 3<&0         # 将所有内容重定向到文件描述符3来关闭文件描述0
Exec 0<<文件>     # 将输入文件放到文件描述符0
while read [选项] <变量>
do
    # 默认每次从文件中读取一整行,也可以通过read支持的选项改变默认行为
    <...>
done

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1027474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ComfyUI】安装 之 window版

文章目录 序言步骤下载comfyUI配置大模型和vae下载依赖组件启动 生成图片解决办法 序言 由于stable diffusion web ui无法做到对流程进行控制&#xff0c;只是点击个生成按钮后&#xff0c;一切都交给AI来处理。但是用于生产生活是需要精细化对各个流程都要进行控制的。 故也…

华为云云耀云服务器L实例评测|部署功能强大的办公套件 ONLYOFFICE

华为云云耀云服务器L实例评测&#xff5c;部署功能强大的办公套件ONLYOFFICE 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 支持镜像1.3 优势技术 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 ONLYOFFICE3.1 ONLYOFFICE 介绍3.2 Docker 环境…

keytool工具生成JKS证书

生成证书 使用jdk keytool生成证书 自建证书不受CA信任&#xff0c;仅适合学习使用&#xff0c;如果需要用到服务中&#xff0c;建议使用由CA颁发的可信证书。如果仅是内部使用&#xff0c;也可以安装自己生成的证书到本机。 生成证书 keytool -genkey -alias jwt -keyalg RS…

vue若依前端项目搭建

1.项目搭建 首先进入到你需要创建的项目目录下面&#xff0c;然后输入命令vue create .创建项目 接下来选择手动搭建&#xff0c;然后把下面图片中的内容选上 再然后继续配置一些参数信息 接下来运行npm run serve项目就启动起来了 2.配置登录界面文件 首先修改src/router…

Pytest单元测试框架 —— Pytest+Allure+Jenkins的应用

一、简介 pytestallurejenkins进行接口测试、生成测试报告、结合jenkins进行集成。 pytest是python的一种单元测试框架&#xff0c;与python自带的unittest测试框架类似&#xff0c;但是比unittest框架使用起来更简洁&#xff0c;效率更高 allure-pytest是python的一个第三方…

深入理解函数模板

函数模板深入理解 编译器从函数模板通过具体类型产生不同的函数 编译器会队函数模板进行两次编译 对模板代码本身进行编译对参数替换后的代码进行编译 注意事项 函数模板本身不允许隐式类型转换 自动类型推导时&#xff0c;必须严格匹配显示类型指定时&#xff0c;能够进行…

推动统一供应链“度量衡”,上汽大通突破传统拥抱SaaS生态

中国汽车市场规模已连续14年位居世界第一&#xff0c;目前占世界汽车份额31%。近年来&#xff0c;物联网、人工智能、电池等技术的快速发展&#xff0c;也为中国从汽车大国逐步迈向汽车强国注入巨大动力。在新一轮的汽车产业变革中&#xff0c;构建一个更智能、更高效协同的供应…

linux内核——进程

Processes and threads 进程是正在运行的程序&#xff0c;包括下列部分的抽象&#xff1a; &#xff08;独立的&#xff09;地址空间一个或者多个线程打开的文件&#xff08;以描述符fd的形式呈现&#xff09;套接字信号量Semaphore共享的内存区域定时器信号句柄signal handl…

加密货币交易所偿付能力的零知识证明

如何检测下一个 FTX 和 Mt. Gox 加密货币交易所 FTX 的内爆导致数十亿客户资金流失&#xff0c;这是加密货币历史上交易所破产的最新例子。历史可以追溯到 2014 年&#xff0c;当时处理 70% 比特币交易的历史最悠久、规模最大的交易所 Mt. Gox 丢失了用户的 850,000 个比特币。…

亚马逊登山扣CPC认证ASTMF1774测试和UIAA121测试报告申请

一.什么是登山扣 答:登山扣是扣子的一种&#xff0c;顾名思义其就是用来在登山的时候配合绳子起到一个承重悬挂的作用.采用铝 吕合金、铁或者是不锈钢等材料制作而成的一种登山工具之一。其形状多样&#xff0c;比较常见的是椭圆 形和圆形的&#xff0c;除此之外还有长方形、…

halcon算子1、dev_open_window

标题dev_open_window 原形&#xff1a;dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle) 功能&#xff1a;显示一个图形窗口 参数&#xff1a; Row:左上角索引行&#xff0c;一般默认0 Column:左上角索引列&#xff0c;一般默认0 Width&#xff…

蓝牙核心规范(V5.4)10.6-BLE 入门笔记之L2CAP

蓝牙篇之蓝牙核心规范(V5.4)深入详解汇总 1.概述 L2CAP负责协议复用、流量控制、服务数据单元(SDU)的分段和重组。它使用通道的概念来分隔在堆栈层之间传递的数据包序列。固定通道不需要设置,立即可用,并与特定的上层协议相关联。通道也可以通过指定的协议服务多路复用器…

【ROS入门】创建工作空间与功能包

文章结构 工作空间文件结构创建工作空间流程创建工作空间编译工作空间设置环境变量/创建功能包创建功能包编译功能包 检查环境变量 工作空间文件结构 工作空间(workspace)是一个存放工程开发相关文件的文件夹&#xff0c;类似于在windows中使用IDE创建的工程。主要分为以下四个…

【Linux基础】第27讲 Linux 查找和过滤命令(二)——grep命令

Grep命令 grep是根据文件的内容进行查找&#xff0c;会对文件的每一行按照给定的模式&#xff08;patter&#xff09;进行匹配查找 基本格式&#xff1a; grep [options]范围 [options] 主要参数 -c: 只输出匹配行的计数 -i : 不区分大小写 -n: 显示匹配行及行号 -w: 显示整个…

Anaconda下载安装教程,新手详细

Anaconda的安装包下载分为官网下载和清华源下载&#xff0c; ①官网&#xff1a;Anaconda官网 &#xff08;别的博主说官网较慢&#xff0c;有时候还进不去&#xff0c;我感觉还行&#xff0c;2分钟就下载好了。如果不顺利&#xff0c;请尝试使用清华源&#xff09; ②清华源…

python学习之【文件读写】

前言 上一篇文章​ ​ python学习——【第十四弹】 ​​​中学习了python中的包与内置模块&#xff0c;这篇文章接着学习python中的文件读写。 编码方式 在学习文件读写之前&#xff0c;我们先了解下python当中的编码方式: 字节(Byte)是计量单位&#xff0c;表示数据量多少…

[BJDCTF2020]Cookie is so stable 模板注入SSTI

这个题目已经在提示我们了 然后我们去hint看看 让我们看看cookie 那我们肯定直接抓包啊 cookie中存在 回显值 但是我觉得一眼看上去就不是sql注入 因为是我们提交东西 而且没有查询的东西 所以我们可以想到是不是其他注入 于是就思考到是不是模板注入 模板注入 模板注入 主要…

matlab读写json文件

Background 通常&#xff0c;在matlab中使用mat文件进行数据存储。MAT文件是MATLAB中用来存储数据的二进制文件格式。MAT文件可以包含各种数据类型&#xff0c;包括数字、矩阵、向量、结构体、字符和函数等。但是&#xff0c;当和其他语言有交互时&#xff0c;mat文件会不太方便…

Stm32标准库_1

代码&#xff1a; #include "stm32f10x.h" // Device headerGPIO_InitTypeDef GPIO_InitStructure;//定义变量结构体int main(void){/*使用RCC开启GPIO的时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启PA端口时钟/*使用GPIO_…

Java高级-反射

反射 1.介绍2.获取Class对象的三种方法3.获取类的构造器4.获取类的成员变量5.获取类的成员方法6.反射的作用和应用场景 1.介绍 反射 加载类&#xff0c;并允许以编程的方式解剖类的各种成分(成员变量、方法、构造器等) 反射步骤 1.加载类&#xff0c;获取类的字节码&#x…