10.shell脚本

一、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的手册:yShell 流程控制 | 菜鸟教程

八、测试语句

测试语句的作用:在设计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,译音八分贝,道友,下期见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bardb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值