一、shell 脚本就是把shell命令写入一个xxx.sh文件中,然后用户执行脚本文件实现自动化配置。
二、常见shell命令
三、编写第一个shell脚本
--------------------开发C语言代码的流程------------------
1.编辑源码文件
touch main.c
vi main.c
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
2.编译main.c 源码文件
gcc main.c
3.执行二进制文件
./a.out
-------------------开发Shell脚本的流程-------------------
1.编辑脚本文件
touch shell.sh
vi shell.sh
#!/bin/bash 👈声明使用bash 解析器解析脚本
echo "hello world"
2.修改文件权限
chmod 777 shell.sh
如果是uabntu中编写的要改权限,如果是在共享中编译的则无需改,直接编译即可
3.执行脚本
./shell.sh
😘注意:所有的脚本语言都不需要编译,直接使用解析器对脚本代码进行解析即可!
1、shell 脚本的输入输出
echo/printf 输出
echo (选项) (参数)
echo "hello \n world" #\n不会换行
echo -e "hello \n world" #\n会换行 -e是激活转义字符
设置输出字体颜色
echo -e "\e[1;31m This is red text \e[0m"
\e[1;31m 将颜色设置为红色
\e[0m 将颜色重新置回
颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37
设置背景颜色
echo -e "\e[1;42m Greed Background \e[0m"
颜色码:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47
设置特效
echo -e "\033[37;31;5m MySQL Server Stop... \033[39;49;0m"
红色数字处还有其他数字参数:0 关闭所有属性、1 设置高亮度(加粗)、4 下划线、5 闪烁、7 反显、8 消隐
printf format [arguments] #格式化输出
format:输出格式 %d ,%f ,%s
arguments:输出的数据
格式化输出例子:
printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323
2、read 输入
read (选项) (参数)
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
例子:读取一个名字
read name
echo $name #打印姓名变量
例子:读取多个变量
read first last #每个变量直接需要用空格隔开
例子:读取一个变量并提示输入
read -p "请输入姓名" name
四、shell 脚本变量
1、shell脚本变量命名规则:
1.由数字,字母,下划线组成,数字不能开头,不能与关键字重名。
2.shell脚本中的变量没有数据类型,默认类型都是字符串。
2、普通变量
由用户自己定义的变量都是普通变量
例子:定义一个普通变量
data=100
str=hello world ❌错误的,hello与world 有空格,所以是两个命令
str=helloworld ✔️正确
data = 100 ❌变量赋值不能有空格
$ 变量引用
echo data #单纯输出字符串 data
echo $data #输出变量data的值
declare 声明变量,设置或显示变量的值和属性。
-i 增加整型属性。
# 定义变量b并赋值为5,具有整型属性。
declare -i b=5
例子:增加变量属性并进行运算
declare -i num=100
declare -i num2=200
declare -i sum=$num+$num2
五、环境变量
环境变量就是操作系统运行时,需要的一些配置参数,例如:系统版本,工具路径,系统语言...... 操作系统在启动的时候
会读取这些环境变量来设置当前系统的运行环境!
export 或者 env 查看系统中的环境变量
SHELL=/bin/bash #SHELL 解析器环境变量
WSL_DISTRO_NAME=Ubuntu-22.04 #WSL系统版本环境变量
PWD=/mnt/e/GZ2502嵌入式/004-文件IO/007-Shell脚本/code #当前工作目录环境变量
LOGNAME=gec #用户名环境变量
HOME=/home/gec #家目录环境变量
LANG=C.UTF-8 #系统编码环境变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin: #PATH ⭐系统工具环境变量
👉/usr/local/sbin 👉/usr/local/bin 👉/usr/bin 告诉操作系统可执行文件在哪里寻找
如果系统没有上述的环境变量则无法正常运行!!!
设置环境变量的值
export 环境变量名=值
临时配置环境变量
export PATH=$PATH:/usr/local/arm/5.4.0/usr/bin
永久配置环境变量
vi ~/.bashrc #打开配置文件
在文件末尾添加
export PATH=$PATH:/usr/local/arm/5.4.0/usr/bin
六、命令行变量
shell 脚本中的命令行变量的作用是在执行脚本时,传递参数给脚本使用,相当于 main 函数的 argc 与 argv
$# : 表示命令参数的个数 👉 等价于 argc
$* : 表示所有参数的值
$@ : 表示所有参数的值
$n : n 表示是第几个 1 2 3 4 ... 👉$1 -> argv[0] , $2 -> argv[1] .....
$? : 表示最后一条命令执行的结果
$$ : 表示当前进程的pid
七、shell 脚本符号
1. "" 双引号
作用:把数据变成一个完整的值
value=hello world #hello 与 world 是分开的两个值
value="hello world" #把hello world 变成一个完整值
"" 双引号中可以引用其他变量的值
value=你好
value1="hello $value world" 👉hello 你好 world
2.{} 间隔变量名
value=你好
value2="hello$valueworld" ❌错误的,把$valueworld当作一个变量
value2="hello${value}world" ✔️${value},把变量独立间隔出来
echo $value2
3.' ' 单引号
作用:把数据变成一个纯字符串
value=你好
value3='hello $value world'
echo $value3 #输出纯字符串 hello $value world
4.` ` 反引号
作用:把字符串中的命令标识出来,作为命令使用
value4="this day is date" 👉this day is date
value5="this day is `date`" 👉this day is Sat Mar 8 16:38:07 CST 2025 把date作为命令输出
5.重定向符号
> : 把内容重定向到一个文件中,覆盖模式
>> : 把内容重定向到一个文件中,追加模式
echo "helloworld" > my.txt #helloworld 覆盖my.txt 的所有内容 ,清空再写入
echo "helloworld" >> my.txt #helloworld 追加到my.txt 文件中
1、< 重定向标准输入
2、| 管道符
加法
echo "10+20" | bc
减法
echo "10-20" | bc
乘法
echo "3*3" | bc
除法
echo "scale=2;1/2" | bc
echo "2^10" | bc #求次方
echo "sqrt(100)" | bc #开根号
八、测试语句
测试语句的作用:在设计shell控制流语句时作为表达式使用!
if test "abcd" != "1234" 👉 test "abcd" != "1234" 根据上述表格编写测试语句
then
echo "字符串不相等"
fi
if [ "abcd" = "abcd" ] 👉 利用 [] 括号代替 test ,必须注意空格! 每个数据与符号都要使用空格分开
then
echo "字符串相等"
fi
九、控制流语句
1、if 单分支控制流
C语言单分支
if( 表达式 )
{
//真则执行
}
shell脚本单分支
if 测试语句
then
//真则执行
if
例子:判断两个字符串是否相同
if test "abcd" = "abcd"
then
echo "字符串相等"
fi
2、if-else 双分支控制流
C语言双分支
if (表达式){
//真 执行
}else {
//假 执行
}
shell脚本双分支
if 测试语句
then
//真 则执行
else
//假 则执行
fi
例子:判断两个数据的大小
declare -i a=10
declare -i b=20
if test $a -gt $b
then
echo "a>b"
else
echo "a<b"
fi
3、if-elif 多分支控制流
C语言多分支
if(表达式1)
{
}else if(表达式2)
.....
else
shell脚本多分支
if 测试语句
then
//真 执行
elif 测试语句
then
//真 执行
.....
else
//假 执行
fi
注意:多分支控制流语句,只会执行最先满足条件的语句,其他不执行!
例子: 判断一个数值的大小
declare -i a=10
declare -i b=20
declare -i c=30
if test $a -gt $b
then
echo "a > b"
elif test $a -gt $c
then
echo "a > c"
else
echo "a<b && a < c"
fi
//练习:获取3个数据 , 利用分支控制流,输出三个数据中的最大值.
#!/bin/bash
read -p 请输入三个数据 a b c
# 判断最大值
if [ $a -gt $b ] && [ $a -gt $c ]; then ⭐; 表示语句已经结束了 ,then无需换行
echo "最大值为: $a"
elif [ $b -gt $a ] && [ $b -gt $c ]; then
echo "最大值为: $b"
else
echo "最大值为: $c"
fi
4、case 选择控制流
C语言swtich 选择控制流
swtich(变量)
case 值1: 语句1; break;
case 值2: 语句2; break;
......
default: 语句n; break;
shell脚本case选择控制流
case 变量 in
数据1) 语句1 ;; # ;; 与 break; 功能一样
数据2) 语句2 ;;
....
*) 语句n ;;
esac
例子:case 选择控制流使用
#!/bin/bash
read -p "请输入一个数据:" num
case $num in
1) echo "星期1";;
2) echo "星期2";;
3) echo "星期3";;
4) echo "星期4";;
5) echo "星期5";;
6) echo "星期六";;
7) echo "星期日";;
*) echo "输入错误" ;;
esac
5、循环控制流
while 循环控制流
语法结构:
while 测试语句
do
语句;
done
until 循环需要测试语句为《真》的时候才会执行!
例子:输出 0 - 100 以内能被2 整除的数据
#!/bin/bash
declare -i num=10
declare -i b=2
while [ $num -le 100 ]
do
declare -i tmp=$num%$b
if [ $tmp -eq 0 ]
then
echo $num
fi
num=($num+1) #不断增加 num 的值
done
6、until 循环控制流
语法结构:
until 测试语句
do
语句;
done
until 循环需要测试语句为《假》的时候才会执行!
//例子:假则执行
#!/bin/bash
declare -i i=0
until [ $i -ge 100 ] # [ $i -le 100 ] 测试语句为真,则不循环 , [ $i -ge 100 ] 测试语句为假,则执行循环
do
echo $i
((i++))
done
7、for 循环语句
语法结构:
for 变量 in 值1 值2 ... 值N ⭐不断把这些值赋值给变量,直到赋值完毕为止
do
语句
done
例子:循环输出 1 - 5
#!/bin/bash
for tmp in 1 2 3 4 5
do
echo $tmp
done
例子:循环输出 0 - 100
for tmp in {0..100} #不断把 0 1 2 3 .. 100 这些值赋值给 tmp
do
echo $tmp
done
例子:转换为C表达式
for (( tmp=0; tmp <= 100 ;tmp++ ))
do
echo $tmp
done
例子:把 ls 的结果赋值给变量,循环遍历
for str in `ls` #把ls 的结果不断地赋值给str
do
echo $str
done
十、shell 脚本实战
# Source configuration files from /etc/profile.d
for i in /etc/profile.d/*.sh ; do 👉把/etc/profile.d/*.sh 目录下的所有 .sh 格式的文件赋值给变量 i
if [ -r "$i" ]; then 👉判断脚本文件是否可读
. $i 👉执行脚本文件
fi
unset i 👉循环结束后删除变量 i
done
PATH=/bin:/sbin:/usr/bin:/usr/sbin 👉设置PATH工具路径环境变量
LD_LIBRARY_PATH=/lib:/lib:/usr/lib 👉设置库环境变量
USER="`id -un`" 👉设置用户名环境变量 USER=root
LOGNAME=$USER 👉设置登录名
HOME=/root 👉设置家目录路径
PS1='[\u@\h \w]\#' 👉设置终端信息提示 '[\u@\h \w]\#' -》 [root@GEC6818 ~]#
export USER LOGNAME HOME PS1 PATH LD_LIBRARY_PATH 设置环境变量,使环境变量生效
#配置QT程序的运行环境,如果删掉那么QT代码就无法在当前开发板运行
export QTDIR=/usr/local/Qt-Embedded-5.7.0
export PATH=$QTDIR/bin:$PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export QT_QPA_PLATFORM_PATH=$QTDIR/plugins
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FONTDIR=/usr/share/fonts
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
#export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/event0
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0
export QMLSCENE_DEVICE=softwarecontext
export QML2_IMPORT_PATH=$QTDIR/qml
#配置当前开发板的网络环境
ifconfig lo 127.0.0.1 up
ifconfig eth0 up
ifconfig eth0 192.168.59.111
route add default gw 192.168.59.254
echo 'nameserver 202.96.128.166' > /etc/resolv.conf
echo 'nameserver 202.96.128.86' >> /etc/resolv.conf
#配置ssh 协议的环境变量
export PATH=/usr/local/bin:/usr/local/Qt-Embedded-5.7.0/bin:/bin:/sbin:/usr/bin:/usr/sbin
至此,希望看完这篇文章的你有所收获,我是Bardb,译音八分贝,道友,下期见