Shell基础

ESP32-CAM入门教程 ArduinoESP32-CAM下载模块(接上USB就能用,很方便,如果没有买就只有资金用USB-TTL了)如下图两个合在一起如下图。 阅读详情

Shell基础

  • Shell:是Linux命令解释器;它是用户与系统内核,之间交互的桥梁;

  • Shell-Script(脚本):一种解释型语言;也是命令式语言;作用是可以批量执行命令,实现一些自动化任务,例如一键安装脚本、自动发送邮件、短信、微信、钉钉、系统巡检脚本、系统优化脚本,数据库备份脚本、垃圾清理脚本等。

总结:

什么时候用到脚本? 重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。

①自动化分析处理   ②自动化备份   ③自动化批量部署安装   ④等等…

开发环境:

  • Linux+vim+可选插件

  • vscode+插件

    • 本地安装

    • 远程访问(ssh)

    • dpkg -i code的下载地址

安装vscode:在浏览器下载后,用dpkg -i 文件路径。

执行脚本的方式:

①/bin/sh 脚本文件或者/bin/bash 脚本文件

②bash 脚本文件或者sh 脚本文件

③./脚本文件

如果权限不够就先chmod +x 脚本

学Shell脚本学什么

  • 基础语法:

  1. 变量

    #输入
    #!/bin/bash
    a=100
    echo $a
    #会输出
    100
  2. 输入、输出

    # 输入
    #!/bin/bash
    echo "Hello shell!"           #输出双引号中的字符串
    read "xxx"                    #输入字符串xxx
    # 会输出
    
    Hello shell!
  3. 判断

  4. 循环

  5. 函数

  6. 数组

  • Linux命令,重点三剑客(awk,grep,sed),运算,数据处理,计划任务

  • 写脚本:

  1. 案例模仿

  2. 照着文档改写

  3. 复杂任务,需求分析,需求拆分,编写模块

shell基础语法

变量

变量:数据的别名,创建变量时,会在内存中开辟存储空间,将数据存入内存中,将变量名与内存地址绑定

变量命名规范:

  • 不要和命令相同,建议使用大写字母;

  • 使用数字、字母、下划线命名,不要以数字开头;

  • Shell变量赋值时,“=”等于号前后不能有空格(且变量名不加$) ;

  • 蛇形命名:my_name(用下划线代替空格,不要用减号);

  • 驼峰命名:小驼峰myName,getAge,setMoney(小写开头)

    大驼峰MyName(大写开头)

  • MYSQL_PATH,MYSQL_PROT

三种引号:

  • 单引号:输出的是字符串本身;(里面的变量无效)

  • 双引号:当包含$变量时,会输出变量的值;(可以出现转义字符)

  • 反引号:引用命令,以字符串方式返回命令的执行结果;

    举例说明
    # 输入
    #!/bin/bash
    MY_PATH=/usr/local/xxx
    echo $MY_PATH
    echo '$MY_PATH'
    echo "$MY_PATH"
    echo "今天的日期是:`date +%Y-%m-%d`"
    
    #会输出
    /usr/local/xxx
    $MY_PATH
    /usr/local/xxx
    今天的日期是:2025-09-02

连接Ubuntu的vscode的ssh(上传远程仓库):

左下角远程连接——连接主机——root@192.168.221.129——连接——输入密码,回车——密码,回车——打开文件夹——/home/cqh/code

或者通过访问以下网址来访问脚本:

[hello.sh · juanxincai/yun11 - 码云 - 开源中国](https://gitee.com/fbdrn/yun11/blob/master/hello.sh)

如何把改动上传仓库?

# 去远程仓库克隆/下载那里复制码到/home/cqh/code目录下
git clone https://gitee.com/fbdrn/yun11.git
# 出现下面这个就是克隆完成
正克隆到 'yun11'...
接收对象中: 100% (23/23), 4.67 KiB | 955.00 KiB/s, 完成.
# 查看yun11目录是否克隆到code目录下
ls
# 进入yun11目录下
cd yun11/
ls
hello.sh  README.md  test1.txt
# 上传同步,把修改的脚本文件复制到yun11下
cp haha.sh ./yun11
git add .
git commit -m ""
git push
# 然后就会上传到源代码管理(分支图标:第三个树枝一样的图形里会出现①)
在框里输入备注然后提交——如果要上传仓库的话就同步——用户名是fbdrn,密码是私有令牌a61933dab2a9eb31aafc49ea0c0c0d2b(如果有公钥可以不用输入这一步)

课堂案例:

# 输入
MY_PATH=/usr/local/xxx
echo '$MY_PATH'
echo "APP的地址是$MY_PATH"
echo `ip a | grep inet | sed -n '3p' | awk '{print $2}' | awk -F"/" '{print $1}'`
MYIP=`ip a | grep inet | sed -n '3p' | awk '{print $2}' | awk -F"/" '{print $1}'`
echo "我的ip地址是:$MYIP"
# 输出
cqh@cqh-virtual-machine:~/code$ bash ./hello.sh
$MY_PATH
APP的地址是/usr/local/xxx
192.168.221.129
我的ip地址是:192.168.221.129

变量分类

普通变量

普通变量:在Shell运行时子Shell中生效;只在当前shell中生效,环境变量是全局生效

# 输入
MY_NAME="chen"
echo $MY_NAME或echo $(MY_NAME)
# 输出
chen
# 删除变量
unset MY_NAME
# 只读变量(不能被删除)
readonly MY_NAME
全局变量(自定义环境变量)

全局变量:export 变量名;(临时生效,重启无效)

①bash:在运行脚本时,会启动一个子Shell执行脚本命令

②source:加载,在当前的父Shell中执行,也就是让脚本里面的命令在当前终端执行

③chmod +x test.sh

./test.sh # ./其实是调用了/bin/bash/test.sh

. test.sh # . 等价于source

# 输入
export MY_NAME="juan"
echo "$MY_NAME"
# 输出
juan

如果想要永久生效,需写入以下配置文件中:

对当前用户:~/.bashrc ~/.profile ~/.bash_profile

对所有用户:/etc/profile

系统环境变量

系统环境变量:env 查看当前Shell的环境变量,如 PATH(命令搜索路径)、HOME(当前用户家目录)、SHELL(默认 Shell 类型)、PWD(当前工作目录)、USER/LOGNAME(当前登录用户名)、LANG(系统语言和编码设置)、TERM(终端类型)。

export PATH=$PATH:/usr/local/mysql/bin # 表示在原有 PATH的基础上,新增 /usr/local/mysql/bin目录,将 “局部变量” 提升为 “环境变量”

# 所有用户开机生效
vim /etc/profile
# 让当前用户开机生效
vim ~/.bash_profile  | ~/.bashrc | ~/.profile
命令 / 文件作用生效范围加载时机
env查看当前环境变量仅当前终端实时执行
export ...临时修改环境变量仅当前终端实时执行,重启失效
/etc/profile永久配置系统级变量所有用户登录时加载
~/.bash_profile永久配置当前用户登录变量仅当前用户登录时加载
~/.bashrc永久配置当前用户终端变量仅当前用户新建终端时加载
~/.profile兼容型用户登录配置仅当前用户登录时加载(备用)
内置变量(特殊变量)★★★

echo :$?,$0,$1~$9,$!,$@,$*,$#

参数含义
$?上一条命令执行是否成功,成功返回0,失败返回其他数字
$0执行脚本时获取的当前脚本的名称
$1~$9显示选项或者参数,第1~第9个参数
$@获取脚本后面所有参数,参数是独立的(竖着输出 "1" "2" "3"),也是全部输出
$*获取脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开,这俩都要用双引号引起来("1 2 3")
$#获取脚本后面接的参数的数量
$!获取后台运行程序的PID (!!是查看当前终端,$$是脚本运行的最后一个进程的ID号),把进程号保存下来,可以通过kill -9杀死这个进程
$-显示 Shell 使用的当前选项,与 set 命令功能相同。

!!注意:$(命令)等价于命令,获取命令的执行结果

变量类型定义方式作用范围典型用途
普通变量name=value当前 Shell / 脚本(局部)临时数据存储
自定义环境变量export name=value当前 Shell 及子进程(全局)父子进程间传递数据
系统环境变量系统预定义,用env查看全局(所有进程)系统配置(路径、语言等)
特殊变量Shell 预定义脚本 / 命令行中自动生效命令行参数、进程状态等

转义字符

\n换行符
\t制表符
\a响铃符
\r回车符,将光标移动到一行的开头

echo

功能:将内容输出到默认的显示设备

-e 意思是可以识别转义字符

-n 不换行

## 识别转义字符
# 输入
echo -e "hello\nworld!"
# 输出
hello
world!
输出颜色字体
第一种方法:
color_start="\033[31m"
color_end="\033[1m"
echo -en "\r$color_start`date +"%H:%M:%S"`$color_end"
第二种方法:
# 字体颜色
for i in {31..37}; do
echo -e "\033[$i;40mHello world!\033[0m"
done
# 背景颜色
for i in {41..47}; do
echo -e "\033[47;${i}mHello world!\033[0m"
done
# 显示方式
for i in {1..8}; do
echo -e "\033[$i;31;40mHello world!\033[0m"
done

第一种:{1..10} {a..z} {A..F}范围循环

第二种:命令 ${命令}

## 死循环电子时钟
while true
do
    echo -en "\r"`date + "%H:%M:%S"`
    echo -en "\r$color_start`date +"%H:%M:%S"`$color_end"
    sleep 1
done
# 循环数字
for i in {0..9}
do
    echo $i
done
# 循环命令的执行结果(每行一个显示)
for i in `ls/`
do
    echo $i
done

## 九九乘法表第一种方法
j=1
for i in {1..9}
do    
    for j in `seq 1 $i`
    do
        echo -en "$i x $j = $(( $i*$j ))\t"
    done 
    echo ""
done

## 九九乘法表第二种方法
for (( i=1;i<=9;i++ ))
do
    for (( j=1;j<=$i;j++ ))
    do
        echo -en "$i x $j = $(( $i*$j ))\t"
    done 
    echo ""
done 

shell数值运算

Shell 算术运算符

Shell 和其他编程一样,支持包括:算术、关系、布尔、字符串等运算符。

原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如 expr。

整数运算(expr)
(1)数字运算
expr 3 + 2
expr 3 - 2
expr 3 \* 2       # 注意*出现应该转义,否则认为是通配符
expr 3 / 2        # 没有小数,只有整数
expr 3 % 3
(2)let支持变量运算,只能做整数运算,且运算元素必须是变量,无法直接对整数做运算
let a=2
let a++
let b=a*3
let c=b%2
echo "a=$a b=$b"
(3)$((  ))同时支持数字运算与变量间运算,双小圆括号运算,在shell中(( ))也可以用来做数学运算
echo $(( a=a+1 ))
浮点运算(bc)

浮点运算是采用的命令组合的方式来实现的 echo “scale=N;表达式”|bc

先bc进入计算器然后进行运算即可,默认只有整数

echo "22 * 33"|bc                        #通用,quit退出
echo "print 22 * 22"| python3     #可以小数运算,vscode和Ubuntu都报错
举例:
echo "scale=2;3/2"|bc
echo "print(3/2)"| python3

# 获取随机整数
echo "import random;print(random.randint(1,100))"| python3
# 获取随机小数
echo "import random;print(random.random())"| python3
或者echo "import random;print(random.uniform(1,100))"| python3
# 获取内存总量与使用量,求内存占用量
total=`free|sed -n "2p"|awk '{print $2}'` 
used=`free|sed -n "2p"|awk '{print $3}'`
echo "print(f'{$used/$total*100:.2f}%')"|python3

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法expr $a + $b 结果为 30。
-减法expr $a - $b 结果为 -10。
*乘法expr $a * $b 结果为 200。
/除法expr $b / $a 结果为 2。
%取余expr $b % $a 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

Shell 关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明英文举例
-eq检测两个数是否相等,相等返回 true。equal[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。not equal[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。greater than[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。less than[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。Greater than or equal to[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。Less than or equal to[ $a -le $b ] 返回 true。

可以通过test命令比较两个整数的关系,但不会返回结果,需要通过$?才能看到结果:

[root@zuolaoshi ~]# test 100 -gt 300;echo $?
1      #100大于300吗?假的
[root@zuolaoshi ~]# test 100 -le 300;echo $?
0      #100小于或等于300吗?真的

Shell布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。

Shell 逻辑运算符

完成一个任务中需要多个条件都满足或者多个条件中只要满足一个即可,那么这就是我们的逻辑运算,以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||逻辑的 OR[[ $a -lt 100 || $b -gt 100 ]] 返回 true
!非运算[ ! false ] 返回 true。

Shell 字符串比较运算符

下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否为0,不为0返回 true。[ -n $a ] 返回 true。
str检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。

Test文件判断命令

在 Linux 中,test 命令是条件测试工具,用于判断文件属性、字符串关系、数值大小等,返回值为 0(表示测试结果为 “真”)或非 0(表示 “假”),常与 if、while 等流程控制语句配合使用。

命令功能:检测文件类型和比较运算

命令用法:test [命令选项] 表达式

test 命令有两种等价语法形式,需注意括号前后必须有空格:

  1. 标准形式:test 条件

  2. 简化形式:[ 条件 ](更常用,本质是 test 命令的别名)

一、文件测试参数(最常用)

用于检测文件 / 目录的存在性、类型、权限、大小、修改时间等,是脚本中判断文件状态的核心参数。

参数测试类型描述(当满足以下条件时返回 “真”)示例(返回真则输出 “OK”)
-e文件存在性指定路径的文件 / 目录存在test -e /etc/passwd && echo "OK"
-f文件类型指定路径是普通文件(非目录、设备文件等)[ -f ~/test.txt ] && echo "OK"
-d文件类型指定路径是目录test -d /home && echo "OK"
-b文件类型指定路径是块设备文件(如硬盘、U 盘)[ -b /dev/sda1 ] && echo "OK"
-c文件类型指定路径是字符设备文件(如键盘、终端)test -c /dev/tty1 && echo "OK"
-s文件大小文件非空(大小 > 0 字节)[ -s ~/log.txt ] && echo "日志非空"
-r文件权限当前用户对文件有读权限test -r /etc/shadow && echo "有读权限"
-w文件权限当前用户对文件有写权限[ -w ~/test.txt ] && echo "有写权限"
-x文件权限当前用户对文件有执行权限(脚本 / 可执行程序)test -x /bin/ls && echo "ls可执行"
-g文件权限文件设置了SGID(组权限继承)[ -g /usr/bin/passwd ] && echo "有SGID"
-u文件权限文件设置了SUID(用户权限继承,如 passwd)test -u /usr/bin/passwd && echo "有SUID"
-k文件权限文件设置了Sticky Bit(仅所有者删自己文件)[ -k /tmp ] && echo "tmp有Sticky Bit"
-nt修改时间文件 A 的修改时间晚于文件 B(Newer Than)test ~/a.txt -nt ~/b.txt && echo "a更新"
-ot修改时间文件 A 的修改时间早于文件 B(Older Than)[ ~/a.txt -ot ~/b.txt ] && echo "a较旧"
二、字符串测试参数

用于比较字符串的相等性、空值、长度等,需注意字符串建议用双引号包裹,避免空格或特殊字符导致解析错误。

参数测试类型描述(返回 “真” 的条件)示例
str1 = str2字符串相等字符串 str1 与 str2 完全相同[ "abc" = "abc" ] && echo "相等"
str1 != str2字符串不等字符串 str1 与 str2 不相同test "abc" != "def" && echo "不等"
-z str空字符串字符串 str 的长度为 0(空字符串)[ -z "$empty_var" ] && echo "变量为空"
-n str非空字符串字符串 str 的长度 > 0(非空)test -n "$name" && echo "变量非空"

注意:字符串比较的常见误区

  • 若变量未定义,[ $var = "test" ] 会解析为 [ = "test" ],导致语法错误;用双引号包裹变量可避免:[ "$var" = "test" ]。

  • = 和 != 是字符串比较专用,不能用于数值比较(数值需用 -eq、-gt 等)。

三、数值测试参数

用于比较两个整数的大小关系,仅支持整数,不支持浮点数。

参数测试类型描述(返回 “真” 的条件)示例
num1 -eq num2数值相等整数 num1 = num2(Equal)[ 10 -eq 10 ] && echo "相等"
num1 -ne num2数值不等整数 num1 != num2(Not Equal)test 10 -ne 5 && echo "不等"
num1 -gt num2数值大于整数 num1 > num2(Greater Than)[ 20 -gt 15 ] && echo "20大"
num1 -lt num2数值小于整数 num1 < num2(Less Than)test 5 -lt 8 && echo "5小"
num1 -ge num2大于等于整数 num1 > 或 = num2(Greater or Equal)[ 10 -ge 10 ] && echo ">=成立"
num1 -le num2小于等于整数 num1 < 或 = num2 (Less or Equal)test 7 -le 9 && echo "<=成立"
四、逻辑运算参数

用于组合多个测试条件(与、或、非),实现更复杂的判断逻辑。

参数逻辑关系描述(结合多个条件)示例(返回真则输出 “OK”)
! 条件逻辑非(NOT)对单个条件取反(真变假,假变真)[ ! -f ~/test.txt ] && echo "不是普通文件"
条件1 -a 条件2逻辑与(AND)条件 1 且 条件 2 均为真时,结果为真test -f ~/a.txt -a -r ~/a.txt && echo "OK"
条件1 -o 条件2逻辑或(OR)条件 1 或 条件 2 有一个为真时,结果为真[ -d ~/dir -o -f ~/file ] && echo "OK"

扩展:更直观的逻辑运算符([[ ]] 与 (( )))

test 命令的简化形式 [ ] 功能有限,实际脚本中更常用 [[ ]](字符串 / 文件测试) 和 (( ))(数值测试),支持更直观的逻辑运算符(&&、||),无需用 -a、-o:

  • 逻辑与:[[ 条件1 && 条件2 ]] 或 (( 条件1 && 条件2 ))

  • 逻辑或:[[ 条件1 || 条件2 ]] 或 (( 条件1 || 条件2 ))

示例:

# 判断“是普通文件且有读权限”
[[ -f ~/a.txt && -r ~/a.txt ]] && echo "OK"
​
# 判断“数值a大于10或小于5”
a=12
(( a > 10 || a < 5 )) && echo "满足条件"
五、核心注意事项

1、空格不可省略:[ 是 test 的别名,必须与后续条件之间加空格,否则会被解析为普通命令(如 [-f file.txt] 会报错)。

2、字符串需加引号:变量或字符串含空格时,必须用双引号包裹(如 [ "$name" = "Zhang San" ]),否则会被拆分为多个参数。

3、数值与字符串比较区分:

  • 数值比较用 -eq、-gt 等(如 [ 5 -gt 3 ]);

  • 字符串比较用 =、!= 等(如 [ "5" = "3" ]),若用 [ 5 = 3 ] 虽不报错,但本质是字符串比较,不推荐。

4、返回值的特殊性:test 命令的返回值与 “真 / 假” 相反 —— 返回 0 表示 “真”,返回非 0 表示 “假”(符合 Linux 命令 “无错为 0” 的约定)。

六、实际脚本示例

结合 if 语句使用 test 命令,判断文件是否存在并创建:

#!/bin/bash
file_path="~/test.txt"
​
# 用 [ ] 判断文件是否不存在
if [ ! -f "$file_path" ]; 
then
    echo "文件 $file_path 不存在,正在创建..."
    touch "$file_path"  # 创建文件
else
    echo "文件 $file_path 已存在"
fi
​
if [ -f /etc/rediss/redis.conf ]
then
    cat /etc/redis/redis.conf
else
    echo "文件不存在"
fi

运行脚本后,若 test.txt 不存在则创建,存在则提示已存在,体现了 test 命令在条件判断中的核心作用。

shell条件——循环和条件语句

流程控制——多分支写法

1)if else语句
# If条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断
​
# 单分支语句 ---比较大小
 if (条件表达式);then
  语句1
 fi
​
# 双分支if 语句
 if (表达式)
  语句1
 else
  语句2
 fi
​
# 多支条件语句 ---判断成绩
 if (表达式)
  语句1
 elif
  语句2
 elif
  语句2
 fi
2) for 循环

格式

# 格式:for name [ [ in [ word ... ] ] ; ] do list ; done
for 变量名 in 取值列表; do
  语句 1
done
3) while 语句

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while condition; do
    command
done
4) 无限循环

无限循环语法格式:

while true; do
    command
done
# 需求: 每隔1秒 打印一次当前时间
#!/bin/bash
while true; do
        date
        sleep 1
done
5) case(Java里的switch,用来做选项)

Shell case 语句为多选择语句。可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case 语句格式如下:

case 值 in
 模式1)
     command1
     command2
     ...
     commandN
     ;;
 模式2)
        command1
     command2
     ...
     commandN
     ;;
esac
case 工作方式如上所示。取值后面必须为单词 in,
每一模式必须以右括号结束。取值可以为变量或常数。
匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。
一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。
如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
退出循环的命令的区别

exit 结束或退出当前的Shell

break 退出当前循环,继续执行下一个代码(终止后面的所有循环)

continue 退出本次循环,继续进行下一次循环

# 循环0~9
n=0
while [ $n -lt 10 ]
do
    echo $n
    n=$(($n+1))
done

函数

概念:一个代码段,起个函数名,通过函数名可以重复调用该代码;

函数的优点:模块化

  1. 代码模块化,调用方便,节省内存

  2. 代码模块化,代码量少,排错简单

  3. 代码模块化,可以改变代码的执行顺序

可以使用$1~$9作为位置参数;

return 0;表示成功,1~127表示失败;

函数定义:

## 语法一:
函数名() {
    代码块
    return N
}
​
## 语法二:
function 函数名() {
      代码块
      return N
}
​
函数中return说明:
1.return可以结束一个函数,类似于前面讲的循环控制语句break(结束当前循环,执行循环体后面的代码)
2.return默认返回函数中最后一个命令的退出状态,也可以给定参数值,该参数值的范围是0-256之间。
3.如果没有return命令,函数将返回最后一个Shell的退出值。

课堂案例:

## 用函数输出0~9,function可以省略
function print_num(){
    n=0
    while [ $n -lt 10 ]
    do
        echo $n
        n=$(( $n + 1 ))
    done
    return 0;
}   
print_num $1
​
## 测试命令是否成功
ch_ok() {
    if [ $? -eq 0 ]
    then
        echo -e "$1 \033[32m【成功】 \033[0m"
    else
        echo -e "$1 \033[31m【失败】 \033[0m"
        exit
    fi
}
yum install vim
ch_ok "yum"
# 或者后两行改成
apt install vim &> /dev/null          # 不显示执行的过程和结果
ch_ok "apt"

第一个显示:

第二个显示:

## 一个循环输入1234查看信息的例子
while true
do
cat <<  EOF
  1.执行查看内存
  2.查看磁盘空间
  3.查看IP地址
  4.退出
EOF
read -p "请选择" chang
case $chang in
  1)
    free -h
    ;;
  2)
    df -h
    ;;
  3)  
    ip a
    ;;
  4)
    exit
    ;;
  *)
    echo "你的输入有误!"
esac
done
光学测量仿真软件:OpticsBuilder_(9).热应力分析与补偿 在OpticsBuilder中,定义材料的热膨胀系数可以通过API进行。以下是一个Python代码示例,展示如何在OpticsBuilder中定义材料的热膨胀系数。 阅读详情

相关推荐

通俗解析:霍尔编码器、光电编码器、电位计、磁编码器和旋转变压器的实战选型指南

本文深入解析了霍尔编码器、光电编码器、电位计、磁编码器和旋转变压器五大主流编码器的工作原理与核心特性。通过对比精度、环境耐受性、成本及寿命等关键维度,并结合消费电子、工业自动化、汽车电子及极端环境等典型应用场景,提供了一份清晰的实战选型指南,旨在帮助工程师根据具体需求,在性能、可靠性与成本间做出最优决策。

weixin_29216353的博客 253

shell 编程基础

shell编程基础

qq_67582098的博客 1882

Vercel静态站被墙别慌!手把手教你用Cloudflare免费CDN+域名解析搞定DNS污染

本文详细介绍了如何利用Cloudflare免费CDN和域名解析解决Vercel静态网站遭遇DNS污染的问题。通过诊断DNS污染、设计Cloudflare解决方案架构、实战配置步骤以及高级调优技巧,帮助用户快速恢复站点访问并提升防护能力。

weixin_27442001的博客 677

shell基础语法

shell基础语法

Garfield0_0的博客 1157

ArcGIS学习记录—SHP文件转换为KML KMZ数据,并显示面要素相应的标注

使用相应软件操作获取KMZ数据得以下发到外业调查人员,使得矢量数据能够更显而易见,可视化,让外业人员的工作减轻许多。(过程步骤是借鉴于网络上的相关人士给的建议,根据这些建议自己做出来的步骤,可能有些粗略,有问题的话可以再进行探讨)...

qq_41046162的博客 5万+

深度学习动画实战:用MotorNerve系统5步实现自然角色交互

本文详细介绍了如何利用腾讯游戏的MotorNerve系统,通过深度学习技术5步实现自然角色动画交互。从环境搭建、基础运动控制到交互过渡和行走转向优化,该系统能显著提升游戏动画制作效率,尤其适合中小团队替代昂贵的动捕方案。重点解析了骨骼动画配置、PFNN控制器使用及Blender工作流集成等核心技术。

book8的博客 685

Shell脚本基础

shell 是一种脚本语言 脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译) shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)打开文本编辑器(vi/vim),新建一个文件first.sh,扩展名为sh(sh代表shell)。扩展名并不 影响脚本执行。 运行Shell脚本方式1. 作为可执行程序 将上面的代码保存为first.sh,并cd到相应目录: $ chmod +x first.sh $ ./first.s

Z2460986913的博客 786

Shell 基础

函数定义# 函数体# 或者# 函数体函数调用直接使用函数名调用,函数可以接受参数,通过$1$2等访问。

shuijing55hi的博客 920

【校园网代理连接问题】已解决,“该设备或资源(Web 代理)未设置为接受端口“7890”上的连接“

我遇到这个问题很多次。每次都是vpn的问题,不止通俗意义上的梯子(clash之类的),还包括校园网vpn。点击“ 拨号和虚拟专用网络设置”中的“设置”, 关闭代理服务器。在打开vpn后或者关闭vpn后无法浏览网页,网页诊断显示“关闭“手动设置代理”中的“使用代理服务器”,关闭对应的本地代理即可。

聆雨。 1万+

多体动力学分析软件:SIMPACK_(3).SIMPACK模型创建与编辑

在 SIMPACK 中,模型的创建与编辑是多体动力学分析的基础。通过了解模型的基本结构、创建方法、编辑技巧和高级功能,用户可以高效地构建和优化复杂的多体系统模型。无论是手动创建、通过脚本创建还是导入现有的 CAD 模型,SIMPACK 都提供了强大的工具和灵活的接口,帮助用户实现精确和高效的仿真分析。希望本节内容对您在 SIMPACK 中进行多体系统建模有所帮助。如有任何问题或需要进一步的指导,请参考 SIMPACK 的官方文档或联系技术支持。

kkchenjj的博客 1011

SHELL基础

SHELL基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 文章目录SHELL基础SHELL脚本SHELL变量SHELL符号和字符串SHELL运算符test命令echo命令SHELL传递参数 SHELL脚本 平时所说的 shell 通常都是指 shell 脚本,但是shell 和 shell script 是两个不同的概念。 示例: v

weixin_45680960的博客 695

OpenCV计算机视觉实战(3)——计算机图像处理基础

本文全面介绍了计算机视觉和数字图像处理的基础知识。从最基本的像素概念入手,详细讲解了图像在计算机中的表示方式,包括RGB、CMYK等色彩空间的工作原理及其应用场景。还系统分析了常见图像和视频文件格式的特点,梳理了计算机图像处理技术的发展历程,并重点介绍了OpenCV这一强大的开源计算机视觉库的功能与应用领域。

qq_30167691的博客 1740

Shell脚本编程基础

Shell脚本的基础知识

weixin_67782795的博客 1416

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

shell基础学习

Shell是在Linux内核与用户之间的解释器程序,通常指的是bash,负责向内核翻译及传达用户/程序指令。

weixin_47699991的博客 1262

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

shell基础知识

shell是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。为什么要学习和使用shell?Shell属于内置的脚本,程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理)语法简单,代码写起来比较轻松,简单易学1.1 记录命令历史我们执行过的Linux命令都会有记录,预设可以记录1000条历史命令。

xiaoquanzeilaniu的博客 611

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【shell】shell脚本之基础语法

定义变量:不需要指定类型,直接赋值即可访问变量:需要在变量名前加上$命名规则:变量名只能包含字母、数字和下划线(_),但不能以数字开头。变量名大小写敏感,myVariable 和 MYVARIABLE 是不同的。读取用户输入:用read命令读取用户输入并存储在变量中:返回上一次的执行结果,返回0为正确,返回其他值则是错误$$:输出当前bash的pid号$0:表示脚本的名称$#:表示位置参数的总个数$@:返回所有的参数,将参数逐个返回$*:返回所有的参数,将参数当作一个整体一起返回。

GB100200的博客 823

【Linux入门】shell基础篇——shell的构成及基础调试

Shell(外壳)是在 Linux/Unix 系统中用于与操作系统进行交互的一种命令行界面。它允许用户通过键入文本命令来执行各种任务,如文件操作、程序运行、设备管理等。Shell 不仅允许用户直接输入命令执行,还可以通过 Shell 脚本将多个命令组合起来,实现更复杂的自动化任务。简而言之就是给要执行的命令按照顺序保存到一个文本文件中,然后给文件可执行权限,可以结合shell控制语句完成更复杂的操作。Shell 的主要功能包括:命令执行:用户可以在 Shell 中输入命令,系统会解释并执行这些命令。

Karoku的博客 1588

《Shell脚本基础详解》玩转Shell

Shell脚本 是一个脚本语言,用来自动执行我们指定的系统命令的。 通俗的讲,再shell脚本当中,我们会编写一些需要使用的系统命令于其中再运行这个叫本的时候,这些被编写进去的系统命令会按照书写的顺序及规则以此运行。 包括后期我们要学的python实际原本也是通过shell演变过去的!! 学习一们语言首先我们要先了解什么叫变量@ 在很多的编程语言当中都会有变量这样一个概念性的名词。 变量实际上是一个抽象的概念。它本身并没有任何意义。只作为一个名称来使用这个名称指代表了什么呢? 我们如果想要在脚本或程序当中设

小啊宇的博客 3688

Linux Shell基础

LinuxShell基础 测试环境:CentOS7.0 1、基础命令 1.1查看系统可用的shell # cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin 1.2查看用户的默认sh

wang_san_shi的专栏 835

shell基础

shell是一种脚本语言,是用户和系统内核通信的方式之一。脚本的本质是一个文件,文件中包含特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(不需要编译)。shashcshtcshbashdash可以使用命令查看当前系统默认使用的shell解析器。变量名 = 变量值需要注意的是,前后不能有空格,因为有空格当前解析器就会将左边的变量名当作命令来解析。定义全局变量需要先定义局部变量,然后使用export命令将局部变量升级为全局变量。变量名 = 变量值 export 变量名。

weixin_45499023的博客 1074

Shell基础语法

shell概述: shell是一个命令行解释器,它接收应用程序、用户命令,然后调用操作系统内核,shell还是一个功能强大的编程语言,易编写,易调试,灵活性强。

程序员乌拉的博客! 3059

Unix基础之 文件基础和Shell

Unix基础之 文件基础和ShellUNIX向来是强劲的作业系统,屹立多年不倒,但是,对一般使用个人电脑的用户来说,确是比较陌生,有见及此,编辑部选择了在个人电脑上也可运行自如,毋须庞大的Mainframe或甚麽大机器的SCO UNIX,介绍给大家,让各位对另一广阔无限的作业领域探首一下,也许玩起Iternet时,会有另一番天地,别错过这一连十二期的「UNIX基础篇」了。可能有些人会误以为UNIX

Linux 从零开始 914
上一篇: Git软件版本控制
下一篇: shell基础(二)
chen_note
博客等级 码龄1年 251粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值