一,什么是Shell脚本?

在linux下,我们已经能够熟练的在终端中输入命令来完成一些常用的操作,但是我们都是一条一
条输入命令。这样会很麻烦,那么有没有一种方式可以将很多条命令放到一个文件里面,然后直接运行这个文件即可?肯定有,这个就是 shell 脚本!

Shell 脚本类似 windows 的批处理文件,shell 脚本就是将连续执行的命令写成一个文件。shell 脚本提供数组、循环、条件判断的等功能。shell 脚本一般是 Linux 运维或者系统管理员要掌握的,作为嵌入式开发人员,只需要掌握 shell 脚本最基础的部分即可。

Shell 脚本的语法规则,就像 C 语言一样,将很多语句按照一定的规则组合起来形成一个程序。但是这里要强调的是,C 语言编写出来的程序是需要经过编译器编译,生成另一个称为 ELF 格式的文件之后才能执行的,但是 Shell 脚本是不需要编译而可以直接执行的,这种脚本语言称为解释型语言(例如Python,JavaScript等)。

二、shell 脚本写法
shell 脚本是个纯文本文件,命令从上而下,一行一行的开始执行。shell 脚本扩展名为.sh。
shell 脚本第一行一定要为:

#!/bin/bash


告诉系统当前这个脚本文件中的所有命令(语句)都使用 /bin/bash 工具来进行解析(指定命令
解析器)

在编辑器中输入代码,会发现第一行是加粗的。之所以写为`#!`才加粗,是因为`#!`是源自于unix的解释符,是实打实的源于Unix的标准。当执行脚本时,会把#!后作为执行脚本的命令。若写为`#!/bin/bash -l`,则使用登录式bash执行该脚本。
三,第一个shell 脚本

#!/bin/bash

echo "Hello Even" #echo 相当于c 语言中的printf 打印输出

Shell脚本中使用#来进行注释。

四,执行.Sh脚本文件

输入:

ls my.sh -l

查看文件是否有可执行权限

其中rwx分别代表读,写,执行三个权限。rw-rw-r文件权限表示三个组,分别代表User权限,Group权限,Other权限。

可以看到文件没有‘X’执行权限,输入

chmod 777 my.sh

可以发现所有组对该文件被赋予了读写执行权限。

rwx分别代表二进制第2,1,0位。全开则为7,全关则为0;只可读->3'b100 = 4,以此类推。

输入

./my.sh

则脚本被执行。

五,常用命令

键盘输入参数:read

#!/bin/bash
read str
echo "Input string:" $str

Shell 脚本是一种弱类型语言,在脚本当中使用变量不需要也无法指定变量的“类型”。缺省状态
下,Shell 脚本的变量都是字符串,即一连串的单词列表。

要引用变量,语法为”$变量名“

read -p "read two arg" age height
echo "arg1 age=$age,height=$height" 

先打印提示内容,再读取多个变量

六,数值计算

Shell只能进行整数计算。语句是$((运算语句))

read -p "input num1,num2" num1 num2
total=$(($num1+$num2))      #直接声明了一个叫total的变量,注意赋值语句不能有空格,和C                        语言不一样
echo "$num1 + $num2 = $total"

七,test命令

test 命令用于查看文件是否存在、权限等信息,可以进行数值,字符,文件三方面的测试。

用test检测文件是否存在?

read -p "input a file name" filename
test -e $filename && echo "$filename exist" || echo "$filename not exist"


&&和||命令:
cmd1 && cmd2 当 cmd1 执行完并且正确,那么 cmd2 开始执行,如果 cmd1 执行完
毕错误,那么 cmd2 不执行。
cmd1 || cmd2 当 cmd1 执行完毕并正确,那么 cmd2 不执行,反之 cmd2 执行。

用test比较两个字符串是否一样?

read -p "input two string:" str1 str2
test $str1 == $str2 && echo "str1 = str2" || echo "str1!= str2"

八,中括号[]判断符

[判断语句] 和tset指令效果相同;[]只能处理== 和 !=两种运算,且变量需要加双引号

read -p "input two string:" str1 str2
[ "$str1" == "$str2" ] echo "str1 = str2" || echo "str1!= str2" #注意[  ]中间要有空格

九,默认变量

$0~$n,表示 shell 脚本的参数,包括 shell 脚本命令本身,shlle 脚本命令本身为$0
$#:#表示最后一个参数的标号。
$@:表$1、$2、$3......

#!/bin/bash
echo "file name" $0          #shell脚本的名字
echo "total param num:" $#   #有多少个参数
echo "whole param:" $@       #整个参数的内容
echo "first param" $1        #第一个参数
echo "second param" $2       #第二个参数

运行命令:

./my.sh a b

懒惰是进步的催化剂,也是失败的引擎。