(1)如果有嵌入式企业需要招聘校园大使,湖南区域的日常实习,任何区域的暑假Linux驱动实习岗位,可C站直接私聊,或者邮件:zhangyixu02@gmail.com,此消息至2025年1月1日前均有效
(2)在Linux开发中,我们有些操作可能会需要多条指令,每次都在终端输入这么多条指令,难免会有些麻烦。
(3)例如我们修改设备树,然后将dts文件编译,烧录进入开发板,重启开发板。这个过程需要进行的操作非常多,而且每次修改设备树都需要进行这些操作,无疑是非常麻烦的。于是为了自动化处理这个过程,前人退出了shell脚本。
(4)声明:本文是根据正点原子视频教程和鸟哥的私房菜所编写。
(1)创建一个shell脚本文件,".sh"后缀的文件就是shell脚本文件。于是我们可以输入touch指令,创建第一个shell脚本。
touch shell_test1.sh
(2)在我们编写shell脚本的时候,是使用的是 bash 。所以,必须要以『 #!/bin/bash 』来宣告这个文件内的语法使用 bash 的语法!
(3)因此每一个shell脚本的第一行永远是 “#!/bin/bash”。
(4)利用echo指令输出字符串。退出保持,然后执行./shell_test1.sh 即可。
#!/bin/bash
echo "hello world!"
(1)在shell中,read用于读取终端数据,如果没有额外的指令,例如"-p",就会将读取到的终端数据存储进入read后面的变量中。
(2)因为我们读取数据,肯定需要告诉用户,我们要得到啥数据。先调用echo,然后再执行read有点略显麻烦。于是read指令有一个"-p"参数,可以先输出字符串,然后再读取数据。因此,read -p 等价于 先echo 再read。
(3)使用**$+变量**,可以引用变量。
#!/bin/bash
echo "please input name:"
read name
echo "your name:" $name
read -p "input your age and height:" age height
echo "your age = $age,your height = $height"
(4)执行效果如下
(1)shell脚本只支持整型的数值运算,公式为$ (( $表达式 ))
#!/bin/bash
echo "please input two int num:"
read -p "first num:" first
read -p "second num:" second
total=$(($first+$second))
echo "$first + $second = $total"
total=$(($first-$second))
echo "$first - $second = $total"
(2)运行结果如下
(1)test命令可以用于查看文件是否存在,以及他的访问权限问题。
(2)
<1>cmd1 && cmd2 ,当cmd1执行完毕并且正确,cmd2执行,否则cmd2不执行。
<2>cmd1 || cmd2 ,当cmd1执行完毕并且正确,cmd2不执行,否则cmd2执行。
<3>分析下面这个指令,test -e $ filename这条指令正确,因为是&&,所以echo "filename exist"会执行。因为echo "filename exist"会执行,而且这里是||,所以 echo "$ filename no exist"不会被执行。
<4>假如test -e $ filename这条指令错误,因为是&&,所以echo "filename exist"不会执行。因为echo "filename exist"不会执行,而且这里是||,所以 echo "$ filename no exist"会被执行。
#!/bin/bash
echo "please input two int num:"
read -p "file name:" filename
test -e $filename && echo "filename exist" || echo "$filename no exist"
(1)利用test指令测试两个字符是否相等,和C语言差不多。直接看实例吧。
#!/bin/bash
echo "please input two string:"
read -p "first string:" firststr
read -p "second string:" secondstr
test $firststr == $secondstr && echo "secondstr == firststr" || echo "firststr != secondstr"
(1)在shell中使用 [] 测试字符串是否相等。
(2)这里有两个需要注意的点:
<1>使用$+变量的时候,需要加上双引号,否则你这个字符串里面有空格的话,他不会将其认为是字符串的一部分。
<2>字符串和左"[“与右”]",都需要加上一个空格。
#!/bin/bash
echo "please input two int num:"
read -p "first string:" firststr
read -p "second string:" secondstr
[ "$firststr" == "$secondstr" ] && echo "secondstr == firststr" || echo "firststr != secondstr"
(1)$ 0 ~ $ n可用于表示shell脚本参数。shell脚本命令本身是$ 0,比如,我们这个文件名为shell_test7.sh。那么输入./shell_test7.sh运行脚本的时候,$ 0 = ./shell_test7.sh。
(2)$ #:用于表示最后一个参数的标号,例如我们输入./shell_test7.sh s dd 。$ 0 = ./shell_test7.sh,$ 1 = s,$ 2 = dd。因此$ #最终得到的最后一个参数dd的下标,即为数字2。
(3)$ @:用于表示$ 1 ~ $ n的集合,例如输入./shell_test7.sh s dd,那么$ @ = s dd。
#!/bin/bash
echo "file name:" $0
echo "total param num" $#
echo "whole param" $@
echo "first param" $1
echo "second param" $2
(1)shell可以通过&&和||实现简单的条件判断,但是如果条件判断之后,我们想执行一堆的指令,怎么办呢?
(2)很显然,&&和||已经无法满足要求。于是,我们可以使用
#格式
# if [条件判断];then
# //当条件判断式成立时,可以进行的指令工作内容
# fi //<—— 将 if 反过来写,就成为 fi 啦!结束 if 之意
# 或者
# if [条件判断];then
# //当条件判断式成立时,可以进行的指令工作内容
# elif [条件判断];then
# //当条件判断式成立时,可以进行的指令工作内容
#else
# //当条件判断式成立时,可以进行的指令工作内容
# fi //<—— 将 if 反过来写,就成为 fi 啦!结束 if 之意
#————————————————————————
#!/bin/bash
read -p "please input(Y/N)" value
if [ "$value" == "Y" ];then
echo "your input is Y"
elif [ "$value" == "N" ];then
echo "your input is N"
else
echo "please input(Y/N)"
fi
(1)在学习C语言的,我们都知道,如果判断条件比较多的时候应当采用switch case语句,这里同理。当我们shell脚本需要进行多个条件判断的时候,可以使用case语句判断。
(2)下面的示例请注意,$ 1表示你在终端输入的第二个参数。详情请看上面的获取shell脚本参数
#格式
# case $变量 in
# "第1个变量内容")
# //代码段
# ;; //<—— 每个类别结尾使用两个连续的分号来处理
# "第2个变量内容")
# //代码段
# ;; //<—— 每个类别结尾使用两个连续的分号来处理
# "第n个变量内容")
# //代码段
# ;; //<—— 每个类别结尾使用两个连续的分号来处理
# esac //<—— 将 case 反过来写,就成为 esac 表示结束case条件判断
#————————————————————————
#!/bin/bash
case $1 in
"a")
echo "param is a"
;;
"b")
echo "param is b"
;;
*)
echo "can't identify!"
esac
(1)shell的指令是从第一行往下执行的,首先进入while语句,会发现value这个变量不存在,所以进入do中的代码。执行完成之后,在进行while判断,直到判断失败,就退出循环。
#格式
# while [判断式]
#do //循环开始
# //代码段
#done
#————————————————————————
#!/bin/bash
while [ "$value" != "close" ]
do
read -p "please input str:" value
done
echo "stop while"
(1)这个和while do done刚好相反,条件不成立的时候循环,条件成立了之后就不循环了。
#格式
# until [判断式]
# do //循环开始
# //代码段
#done
#————————————————————————
#!/bin/bash
until [ "$value" == "close" ]
do
read -p "please input str:" value
done
echo "stop until "
(1)如果学习过python,那么这个循环应该就会比较熟悉。用法差不多。
(2)我们在in后面传入变量,然后这些变量都会传入循环遍历中依次执行。
#格式
# for [循环变量] in 传入的变量
# do //循环开始
# //代码段
#done
#————————————————————————
#!/bin/bash
for char in a b c d abcd
do
echo "char is :$char"
done
(1)和C语言的for语句使用差不多,不过唯一需要注意的一点在于,shell的for需要两个(),而C语言的只需要一个()。
#格式
# for((初始值;判断语句;执行步数))
# do //循环开始
# //代码段
#done
#————————————————————————
#!/bin/bash
read -p "please input count:" count
total=0
for((i=0;i<=count;i=i+1))
do
total=$(($total+$i))
done
echo "1+2+...+$count=$total"
(1)在shell中,创建自定义函数,需要关键字function + 函数名。之后就可以在{}中假如代码了。
(2)如果需要调用自定义函数,只需要函数名即可,而不是像C语言那样,函数名+()。
#格式
# function 函数名()
#{
# //代码段
#}
#————————————————————————
#!/bin/bash
function help(){
echo "thise is help cmd!"
}
function close(){
echo "thise is close cmd!"
}
case $1 in
"-h")
help
;;
"-c")
close
;;
esac
(1)这里的函数传参不像c语言,函数名(参数1,参数2)。
<1>shell脚本传参:函数名 [空格] 参数1 [空格] 参数2
<2>如果需要调用参数,就是执行$ n。和上面 获取shell脚本参数部分类似。
#格式
# function 函数名()
#{
# //代码段
# 调用参数1:$1
# 调用参数2:$2
# ...
# 调用参数n:$n
#}
# 函数名 [空格] 参数1 [空格] 参数2 [空格] ... [空格] 参数n
#————————————————————————
#!/bin/bash
function print(){
echo "param 1:$1"
echo "param 2:$2"
}
print a b