1.shell是什么

Linux基础 shell脚本 知识架构 思维导图 linux shell脚本入门_命令行


Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

2.Shell Hello world

2.1基本格式要求
  • 脚本以#!/bin/bash开头
  • 脚本有可执行权限
2.2第一个shell脚本
  • touch hello.sh
  • chmod 744 hello.sh
  • vim hello.sh
#!/bin/bash
echo "hello,world!"
2.3两种执行方式
  • ./hello.sh (推荐使用方式)
  • sh ./hello.sh:这种方式不需要赋予可执行执行权限

3.shell 变量

3.1.系统变量
  • 常见:$HOME$PWD$SHELL$USER等等
  • 显示所有系统变量命令:set
3.2.自定义变量
  • 定义变量规则

1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
2)等号两侧不能有空格
3)变量名称一般习惯为大写

  • 基本语法

1)定义变量:变量=值
2)撤销变量:unset变量
3)声明静态变量:readonly变量,注意:不能unset(删除变量)

  • 举例
# 1.定义一个变量,并把它撤销
A=100
echo "A=$A"
unset A
echo "A=$A"

# 2.定义一个静态变量
readonly B=2
echo "B=$B"
unset B    #注意静态变量不能撤销
echo "B=$B"
  • 将命令的返回值复制给变量

1)A=ls-1a’反引号,运行里面的命令,并把结果返回给变量A
2)A=$(ls-1a)等价于反引号

3.3.设置环境变量
  • 基本语法

1)export 变量名=变量值(功能描述:将shell变量输出为环境变量)
2)source 配置文件(功能描述:让修改后的配置信息立即生效)
3)echo $变量名(功能描述:查询环境变量的值)

  • 举例

1.在/etc/profile文件定义一个TOMCAT_HOME环境变量

Linux基础 shell脚本 知识架构 思维导图 linux shell脚本入门_环境变量_02


2.使定义的环境变量生效


source /etc/profile

3.查询环境变量


Linux基础 shell脚本 知识架构 思维导图 linux shell脚本入门_命令行_03


4.shell中调用


Linux基础 shell脚本 知识架构 思维导图 linux shell脚本入门_shell脚本_04

3.4.位置参数变量
介绍

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如:./myshell.sh100 200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息

基本语法
  • $n (功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
  • $*(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
  • $@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
  • $#(功能描述:这个变量代表命令行中所有参数的个数)
举例

编辑一个shell脚本在脚本中获取各个参数信息

#!/bin/bash

echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"

Linux基础 shell脚本 知识架构 思维导图 linux shell脚本入门_命令行_05

3.5.预定义变量
介绍

就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用

基本语法
  • $$(功能描述:当前进程的进程号(PID))
  • $!(功能描述:后台运行的最后一个进程的进程号(PID))
  • $?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
举例

在一个shell脚本中简单使用一下预定义变量

#!/bin/bash
echo "当前进程=$$"
#./shell4.sh &
echo "最后进程=$!"
echo "执行的值$?"

Linux基础 shell脚本 知识架构 思维导图 linux shell脚本入门_shell脚本_06

4.数组

介绍

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。
与大部分编程语言类似,数组元素的下标由0开始。

语法
array_name=(value1 ... valuen)
举例
#定义一个数组并输出每一个值
arr=(1 2 "A")
echo "${arr[0]}"
echo "${arr[1]}"
echo ${arr[2]}

#获取数组长度
echo "${#arr[*]}"
echo "${#arr[@]}"

#给数组赋值
arr1[0]=A
arr1[1]=B
arr1[2]=C
#获取所有数组元素
echo "${arr1[*]}"
echo "${arr1[@]}"

#for循环遍历数组
for i in "${!arr1[*]}";
do
        echo $i
done

5.运算符

5.1基本语法
  • $((运算式))或者$[运算式]
  • expr 运算式 expr运算符之间要有空格
expr 2 \* 3    2x3
expr 6 / 3     6➗3
expr 7 % 2     取余
5.2举例
#!/bin/bash

#计算2x3的值
R1=$((2*3))
echo "R1=$R1"

#计算2*3的值
R2=$[2*4]
echo "R2=$R2"

#先计算2+3,再用原来的结果乘以3
TEMP=`expr 2 + 3`
R3=`expr $TEMP \* 3`
echo "R3=$R3"

6.条件判断

三种类型
  • if
if condition
then
    command1 
    command2
    ...
    commandN 
fi
  • if else
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi
  • if else if
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
举例
  • if
if [ "ok" = "ok" ]
then
        echo "equal"
fi
  • if else
A=2
if [  $A=2  ]
then
        echo "===="
else
        echo "!====="
fi
  • if else if
if [ $1 -gt 1 ]
then
        echo "$1大于1"
elif [ $1 -lt 1 ]
then
        echo "$1小于1"
fi

case

#案例1:当命令行参数是1时,输出“周一”,是2时,就输出”周二”,其它情况输出“other"
case $1 in
"1")
echo "星期一"
;;
"2")
echo "星期二"
;;
*)
echo "其他"
;;
esac

循环

  • for循环
#打印命令行输入的参数
for i in "$*"
do
        echo "the num is $i"
done
#--------------
#计算从1加到100的值并输出
SUM=0
for((i=0;i<100;i++))
do
        SUM=$[$sum+$i]
done
        echo "SUM=$SUM"
  • while循环
#案例1:从命令行输入一个数n,统计从1+..+n的值是多少?
SUM=0
i=0
while [ $i -le $1  ]
do
        SUM=$(($SUM+$i))
        i=$[ $i+1 ]
done
echo "sum=$SUM"

函数

#第一个
function add(){
	echo "hello world"
}
#调用
add

# 传参数
function fun(){
	echo "第一个参数$1"
	echo "第二个参数$2"
	echo "参数列表$*"
	echo "参数个数$#"
}
fun 1 2 3

#返回结果
function funReturn(){
	read -p "请输入第一个参数" n1
	read -p "请输入第二个参数" n2
	return $[$n1+$n2]
}
funReturn
echo "输入的两个参数相加的结果:$?"