linux的学习(四)shell编程

目录

shell

1. 创建第一个shell脚本

2.执行脚本

3.变量

3.1 shell中变量的设置规则

3.2 变量的分类

3.3 设置变量

3.4 变量的赋值

3.4.1 在定义的同时用一个字母进行赋值

3.4.2 将一个命令的输出结果给一个变量赋值

3.4.3 将一个变量的值给另外一个变量进行赋值

3.5变量的叠加

3.6 readonly

3.7 环境变量

3.8位置参数变量

4.read命令

5.数组

5.1 定义数组

5.2 数组中的元素访问

5.3 数组遍历

6.条件控制

6.1关系运算符

6.2 逻辑运算符

6.3字符串判断

6.4文件判断

7.流程控制

7.1 if

7.2 case

7.3 for

7.4 while

7.5 until


shell

shell本身就是C语言编写的程序,是用户去操作linxu/Unix的桥梁,用户的很多操作都是通过shell完成的。shell既是一种命令语言,也是一种编程语言。

 

shell执行的方式 

  • 交互式

    • 解释执行用户的命令,用户输入一行命令就执行一行。

  • 批处理(Batch)

    • 用户先写一个shell脚本,可以把很多的命令都放到这个脚本中。可以去执行这个脚本文件,从而一次性的执行这个脚本文件中的所有命令。

在linux/Unix上,shell的解释器有很多,常见的有:bash、sh、csh、ksh,我们常说的“多种shell”其实是指的多种shell解释器。

  • bash:是linux上默认的解释器。内部的命令有40个。

  • sh:是Unix上默认的解释器。

bash是完全兼sh的

1. 创建第一个shell脚本

  • 创建一个文件即可,这个文件最好用.sh作为结尾

  • 在文本的第一行写入:#!/bin/bash

    • 这句话的含义是:告诉系统,使用哪个解释器来解释这个脚本

  • 保存这个文本即可

vi first.sh

2.执行脚本

  • 输入脚本的绝对路径或者相对路径

    • 使用这种方式执行shell,需要给脚本添加 x权限

  • 使用bash或者sh命令(无需x权限)

  • 使用 . 执行. first.sh

  • 使用source命令

注意: 以上方式在执行脚本的时候是有区别的:

  1. bash、sh命令,会创建一个新的bash,并且在新的bash中执行脚本。和当前bash没有变量共享。

  2. . 执行脚本的时候,会在当前的bash执行,可以共享到当前bash中的变量。

3.变量

3.1 shell中变量的设置规则

  • 变量可以由字母,数字,下划线组成,数字不能作为开头。

  • 在bash中变量的类型只有一个,就是字符串

  • 变量的赋值用 = 赋值,=左右两侧不能有空格

  • 如果变量的值需要包含空格,则这个值需要用' '或者“ ”括起来

3.2 变量的分类

可以分为 用户自定义变量系统变量位置参数变量预定义变量。可以使用set指令查看当前系统中所有的变量,可以使用unset指令撤销一个变量。

系统变量:存储系统环境相关的变量,例如:PATH、PWD、USER、

位置参数变量:主要用于存储执行脚本的时候传递的参数。

预定义变量:是bash中已经定义好的变量,有着特殊含义

3.3 设置变量

定义:习惯上来说,我们用大写字母定义变量

使用:使用 $·取出指定变量的值

3.4 变量的赋值

3.4.1 在定义的同时用一个字母进行赋值

NAME=xiaoming
echo $NAME

3.4.2 将一个命令的输出结果给一个变量赋值

COM=`ls -l`     #执行一次ls并将得到的结果赋值给COM变量
COM=$(ls -l)    #等价于上面的方式
COM=$((4+5))    #将两个数字的运算结果给一个变量
COM= `expr 4 + 5`   #将两个数字进行四则运算的结果给一个变量赋值
                    #运算符两侧需要有空格
                    #在expr运算中,*是需要转义的

3.4.3 将一个变量的值给另外一个变量进行赋值

COM=$PATH

3.5变量的叠加

将一个变量的值和另外一个变量的值进行拼接组合。

A=123
B="$A"456
echo $B         #得出123456
​
B=$A/456
echo $B         #得到123/456
​
B=${A}456       #123456

单引号与双引号的区别:

单引号中的内容会原义输出,不会进行任何变量解析。

双引号中的变量,会自动的解析成变量的值。

3.6 readonly

可以将一个变量做成只读,只读的变量不能修改值。

只读变量不能删除。

3.7 环境变量

环境变量是变量的一种,用户自定义的变量只在当前的shell中生效,环境变量可以在当前shell以及子shell中生效,如果将一个环境变量写入配置文件,则在所有的shell中都可以生效。

export 变量名=值        #定义了一个环境变量
# /etc/profile

3.8位置参数变量

可以去捕获执行脚本的时候,传入的参数。

位置参数不能自定义名字,只能用特定的符号来表示。

$0:代表脚本本身

$1-9:顺序获取第1个到第9个参数

$(10):获取第10个参数

 

$*:获取参数列表中所有参数,将所有的参数视为一个整体,以“1 2 3 4 ... n”形式输出

$@:获取参列表中的所有参数,把每个参数区分对待,以“1”,“2”,“3”,“4”..."n"形式输出。

4.read命令

read是一个输入指令,可以将用户的输入给一个变量进行赋值

read NAME       # 将从控制台输入的内容给NAME赋值

-p:一个输入时候的提示语句

-s:隐藏输入,不显示输入的信息,常见于密码

-n:限制输入的位置

5.数组

bash仅支持一维数组,并且没有限制数组的大小

5.1 定义数组

数组在shell中,使用()来定义,小括号中填充数组中的元素,元素之间以空格来区分。

ARRAY=(10 20 30 hello world 0)

5.2 数组中的元素访问

也是通过下标访问,下标也是从0开始

与Java不同,如果访问到一个不存在的下标,程序不会出错,只是得到一个空值。

可以通过${ARRAY[0]}获取数组ARRAY中的第0个元素

可以通过${ARRAY[@]}或者${ARRAY[*]}获取数组ARRAY中的全部元素

可以通过${#ARRAY[@]}获取${#ARRAY[*]}获取数组的长度

5.3 数组遍历

for 变量 in ${ARRAY[@/*]}
do
xxxx
done

6.条件控制

6.1关系运算符

仅支持数字进行关系判断

>   :-gt
<   :lt
==  :-eq
!=  :-ne
>=  :-ge
<=  :-le
[ $A -eq $B ]   :判断两个变量的值是否相同

6.2 逻辑运算符

&&  :-a
||  :-o
!   :!

6.3字符串判断

=     :判断两个字符串是否相同
!=     :判断两个字符串是否不同
-z      :检测字符串长度是否为0
if [ -z "" ]
    echo "为0“
fi
-n      :检测字符串长度是否不为0
直接用字符串判断    :检测字符串是否为空

6.4文件判断

-d        : 检测目标路径是否是一个目录
-f        : 检测目标路径是否是一个文件
-e        : 检测目标路径是否存在

-r        : 检测一个文件是否可读
-w        : 检测一个文件是否可写
-x        : 检测一个文件是否可执行

-s        : 检测一个文件是否为空(大小为0)

7.流程控制

7.1 if

if [ 条件 ]
then
xxx
fi
if [ $1 -ge 0 ]         #$1表示第一个参数
then 
    echo "这是一个正数" 
fi
echo 程序结束
if [ $1 -ge 0]; then echo "这是一个正数"; fi 
#若写在一行,语句后要加分号
if [ $NUM1 -gt $NUM2]
then
    echo "$NUM1 大于 $NUM2 "
elif [ $NUM1 -lt $NUM2]
    echo "$NUM1 小于 $NUM2"
else
    echo "$NUM1 等于 $NUM2"
fi

7.2 case

case 变量 in
value1)
    xxx
    ;;
value2)
    ;;
*)
esac
case $1 in
1)
    echo 春天
2)
    echo 夏天
3)
    echo 秋天
4)
    echo 冬天
*)
    echo 不存在
esac

7.3 for

for 变量 in 集合
do
xxx
done
for i in {5..50}
do 
    echo $i
done

7.4 while

i=1
while [ $i -ls 10]
do
    echo $i
    i= `exp $i + 1` 
done

7.5 until

和while逻辑一样,和while的区别是:

util后面的条件如果成立则循环停止,如果不成立,循环继续

8.方法

在方法中:

$1 :获取第一个参数

$* :获取所有参数

$# :获取参数的数量

$? :获取上一次执行方法的返回值

在shell中,方法的定义必须放在前面

function test(){
    echo "hello world"
}
test
​
function test1(){
    sum=`expr $1 + $2`
    return $sum
}
test1 10 20
​
function test2(){
    return 
}
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值