Shell脚本

目录

知识点1【shell的概述】(了解)

1、脚本的概述

 2、创建一个脚本

3、如果脚本文件没有“可执行权限”,需要加上可执行权限x

4、./00_shell.sh执行脚本

5、单个#表示注释

6、脚本的三种运行方式

知识点2【shell的变量】(了解)

1、自定义变量

取消变量

获取键盘输入 read

只读变量

2、环境变量

3、环境变量

知识点3【脚本的特殊用法】(了解)

1、""(双引号):包含的变量会被解释

2、''(单引号):包含的变量会当做字符串解释

3、``(数字键 1 左面的反引号)

4、\转义字符

5、(命令序列):

6、{命令序列}

知识点4【条件测试语句】(了解)

1、条件测试的概述:

        第一种语法: test condition

        第二种语法:[ condition ]

2、文件测试

3、字符串测试

4、数值的测试

5、复合测试

1、命令执行控制(逻辑与 逻辑或)

2、多重条件判定

知识点5【 控制语句 】(了解)

1、if控制语句

格式一:

格式二:

案例1:

案例2:

2、case 控制语

3、for循环语句

格式一:

案例1:求0~100的和

格式二:

案例1:判断当前路径下的文件是否是文件或目录

4、while循环语句

5、until语句

6、break continue

break:

contiune:

知识点6【 函数 】(重要)

1、函数的定义形式

2、函数的调用

3、完整代码

4、shell函数分文件

知识点7【变量的扩展】

1、判断变量是否存在

2、字符串的操作


知识点1【shell的概述】(了解)

1、脚本的概述

        C语言是编译语言,编程后用到编译器进行编译,shell是脚本语言,编程后通过解析器可以直接运行脚本程序。

        shell的两层含义:shell解析器(软件)、shell语言(语言)

        shell从语言的角度 批处理语言

        linux下常见的解析器:sh、ash、bash

brightsky@Bright-SKY:~$ echo $SHELL
/bin/bash

        linux中通过打印环境变量可以查看使用的shell解析器

 2、创建一个脚本

brightsky@Bright-SKY:~$ vi myshell.sh

 通过任何一个编译器创建一个shell脚本,后输入以下脚本:

#!/bin/bash
echo "hello shell"

3、如果脚本文件没有“可执行权限”,需要加上可执行权限x

权限修改命令使用chmod:

chmod u+x xxx.sh
brightsky@Bright-SKY:~/codes/blog$ ls -l shell00.sh 
-rw-rw-r-- 1 brightsky brightsky 30 7月   4 12:42 shell00.sh
brightsky@Bright-SKY:~/codes/blog$ chmod u+x shell00.sh 
brightsky@Bright-SKY:~/codes/blog$ ls -l shell00.sh 
-rwxrw-r-- 1 brightsky brightsky 30 7月   4 12:42 shell00.sh

4、./00_shell.sh执行脚本

brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh 
hello shell

5、单个#表示注释

#!/bin/bash
echo "hello shell"
# echo "hello #" 注释

6、脚本的三种运行方式

./shell00.sh   使用#!指定的解析器 如果不存在使用系统默认解析器
bash shell00.sh  明确使用bash解析脚本 #!指定的解析器优先级低于bash
. shell00.sh    使用默认解析

知识点2【shell的变量】(了解)

自定义变量、环境变量、预设变量

1、自定义变量

#!/bin/bash
num="hello"
echo $num #$num取num的值
num=100
echo "num=$num"

给变量赋值的时候 =两边不能有空格

取消变量

#取消变量
unset num
echo "num=$num" 无法识别num的值

获取键盘输入 read

#!/bin/bash
#获取键盘输入
echo "请输入num的值:"
read num
echo "num=$num"

#提示 并 获取键盘输入
read -p "请输入num的值:" num
echo "num=$num"

#获取多个变量的值
read -p "请输入两个值:" data1 data2
echo "data1=$data1"
echo "data2=$data2"

只读变量

#!/bin/bash

#定义只读变量
readonly num=10     #注意 不要加空格 不要加空格 不要加空格
num=100             #只读变量不允许赋值
echo "num=$num"

#./shell00.sh: 行 5: num:只读变量
#num=10

2、环境变量

我们在当前终端导出的环境变量在其他终端是找不到的,因为每个终端开启时只是拷贝了一份系统环境变量,并不是直接使用的系统环境变量。

#!/bin/bash

#导出环境变量num
export num=100
echo "num=$num"

所有的环境变量尽量大写

查看环境变量的指令:env

~/.bashrc (每个用户 都拥有独立的.bashrc) 改文件的配置信息 针对与 当前用户

/etc/profile 所有用户共享的配置文件

如果我们希望修改的环境变量在当前用户访问不受终端影响,我们可与将环境变量配置到~/.bashrc中,当我们用当前用户登录系统时会自动运行这个脚本进行环境变量配置

如果我们希望修改的环境变量在任何用户都可以访问并且不受终端影响,我们可与将环境变量配置到/etc/profile中,当我们登录系统时会自动运行这个脚本进行环境变量配置

当修改文件后,可以直接使用source重新加载配置文件,如 source ~/.bashrc重新加载~/.bashrc

brightsky@Bright-SKY:~/codes/blog$ source ~/.bashrc 
欢迎来到Brightsky个人空间~~

3、环境变量

$#:传给 shell 脚本参数的数量 
$*:传给 shell 脚本参数的内容 
$1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开 
$?:命令执行后返回的状态 
    "$?"用于检查上一个命令执行是否正确(在 Linux 中,命令退出状态为 0 表示该命令正确执行,任何非 0 值表示命 令出错)。 
$0:当前执行的进程名 
$$:当前进程的进程号 "$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复
#!/bin/bash
#打印参数的数量
echo "参数的数量:$#"
echo "参数的内容:$*"
echo "第1个参数:$1"
echo "第2个参数:$2"
echo "第3个参数:$3"
echo "第4个参数:$4"
echo "上条语句执行状态:$?"
echo "当前的进程名:$0"
echo "当前的进程号:$$"
read  num #仅仅是阻塞一下而已


#brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh 
#参数的数量:0
#参数的内容:
#参数1:
#参数2:
#参数3:
#参数4:
#上一语句的执行状态:0
#当前进程名:./shell00.sh
#当前的进程号:5707

#brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh 你好 我是 Brightsky 大家好
#参数的数量:4
#参数的内容:你好 我是 Brightsky 大家好
#参数1:你好
#参数2:我是
#参数3:Brightsky
#参数4:大家好
#上一语句的执行状态:0
#当前进程名:./shell00.sh
#当前的进程号:5716

知识点3【脚本的特殊用法】(了解)

1、""(双引号):包含的变量会被解释

2、''(单引号):包含的变量会当做字符串解释

#!/bin/bash

num=100
echo "num=$num" #$num能解释
echo 'num=$num' #$num不能解释

#num=100
#num=$num

3、``(数字键 1 左面的反引号)

反引号中的内容作为系统命令,并执行其内容

#!/bin/bash

num=100
echo "num=$num" #$num能解释
echo 'num=$num' #$num不能解释

echo "today is `date`"

#brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh 
#num=100
#num=$num
#today is 2021年 07月 04日 星期日 13:20:35 CST

4、\转义字符

需加-e 转义

#!/bin/bash

echo "###\n###"
echo -e "###\n###"

brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh 
###\n###
###
###

5、(命令序列):

子 shell 来完成,不影响当前 shell 中的变量

#!/bin/bash

num=100
(
    num=10
    echo "子shell中的num=$num"
)
echo "当前shell中的num=$num"

#子shell中的num=10
#当前shell中的num=100

6、{命令序列}

当前 shell 中执行,会影响当前变量

#!/bin/bash

num=100
{
    num=10
    echo "{}里面的num=$num"
}  
echo "{}外面的num=$num"

知识点4【条件测试语句】(了解)

1、条件测试的概述:

        关键字:test

        第一种语法: test condition

        第二种语法:[ condition ]

        文件测试、字符串测试、数字测试、复合测试

2、文件测试

        文件测试:测试文件状态的条件表达式

        -e 是否存在 -d 是目录 -f 是文件 -r 可读 -w 可写 -x 可执行 -L 符号连接 -c 是否字符设备 -b 是否块设备 -s 文件非空

#! /bin/bash

read -p "please input a filename >>>" FILE

test -e $FILE
echo "存在? $?"

test -s $FILE
echo "非空? $?"

test -r $FILE
echo "可读? $?"

test -w $FILE
echo "可写? $?"

test -x $FILE
echo "可执行? $?"

[ -s $FILE ]
echo "非空? $?"

[ -r $FILE ]
echo "可读? $?"

[ -w $FILE ]
echo "可写? $?"

[ -x $FILE ]
echo "可执行? $?"

test -b $FILE
echo "是块设备文件? $?"

test -c $FILE
echo "是字符设备文件? $?"

test -d $FILE
echo "是目录文件? $?"

test -f $FILE
echo "是普通文件? $?"

test -L $FILE
echo "是软连接文件? $?"

test -S $FILE
echo "是嵌套字文件? $?"

test -p $FILE
echo "是管道文件? $?"

please input a filename >>>shell00.sh
存在? 0
非空? 0
可读? 0
可写? 0
可执行? 0
非空? 0
可读? 0
可写? 0
可执行? 0
是块设备文件? 1
是字符设备文件? 1
是目录文件? 1
是普通文件? 0
是软连接文件? 1
是嵌套字文件? 1
是管道文件? 1

3、字符串测试

        test str_operator “str”

        [ str_operator “str” ]

        test “str1” str_operator “str2”

        [ “str1” str_operator “str2”]

        其中 str_operator 可以是:

                = 两个字符串相等

                != 两个字符串不相等

                -z 空串 -n 非空

#! /bin/bash

read -p "请输入第一个字符串" str1
read -p "请输入第二个字符串" str2

test -n $str1
echo "str1 非空:$?"
[ -n $str2 ]
echo "str2 非空:$?"

test $str1 = $str2
echo "相等:$?"

[ $str1 != $str2 ]
echo "不等:$?"

请输入第一个字符串123
请输入第二个字符串321
str1 非空:0
str2 非空:0
相等:1
不等:0

4、数值的测试

测试数值格式如下:

        test num1 num_operator num2

        [ num1 num_operator num2 ]

        num_operator 可以是:

                -eq 数值相等

                -ne 数值不相等

                -gt 数 1 大于数 2

                -ge 数 1 大于等于数 2

                -le 数 1 小于等于数 2

                -lt 数 1 小于数2

#! /bin/bash

read -p "请输入第一个值" data1
read -p "请输入第二个值" data2

test $data1 -ge $data2
echo "数值大于等于:$?"

[ $data1 -lt $data2 ]
echo "小于:$?"

请输入第一个值123
请输入第二个值321
数值大于等于:1
小于:0

5、复合测试

1、命令执行控制(逻辑与 逻辑或)

&&:

command1 && command2

&&左边命令(command1)执行成功(即返回 0)shell 才执行&&右边的命令

||:

(command2) || command1 || command2

||左边的命令(command1)未执行成功(即返回非 0)shell 才执行||右边的命令(command2)

#! /bin/bash

read -p "请输入0-100的数" data
[ $data -ge 0 ] && [ $data -le 100 ]
echo "0-100:$?"

请输入0-100的数87
0-100:0

2、多重条件判定

知识点5【 控制语句 】(了解)

1、if控制语句

格式一:

if [ 条件1 ];then
    语句1
else
    语句2
fi

格式二:

if [ 条件1 ];then
    语句1
elif [ 条件2 ];then
    语句2
else
    语句3
fi

案例1:

        请输入你的指令y表示继续 n表示退出

#! /bin/bash

read -p "请输入y/n:" y
if [ $y = "y" ];then
    echo "输入$y, 继续"
elif [ $y = "n" ];then
    echo "输入$y, 退出"
else
    echo "输入非法指令"
fi


brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入y/n:n
输入n, 退出
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入y/n:y
输入y, 继续

案例2:

        请输入文件夹的名字,判断该文件夹 是否存在 如果存在进入该文件夹,如果不存在,请提示输入y创建改文件夹 并进入,输入n退出

#!/bin/bash
read -p "请输入文件夹的名字:" dir

#判断文件夹是否存在
if [ -e $dir -a -d $dir ];then
    #存在 进入文件
    cd $dir
    echo "已进入文件夹:$PWD"
else
    #不存在 输入y创建并进入  输入n退出
    read -p "是否创建$dir文件夹y/n:" y
    if [ $y = "y" ];then
        mkdir $dir
        cd $dir
        echo "已进入文件夹:$PWD"
    elif [ $y = "n" ];then
        echo "立即退出"
        exit 1
    fi
fi

2、case 控制语

case $变量名称 in
    "第一个变量内容")
        程序段一
        ;;
    "第二个变量内容")
        程序段二
        ;;
    *)
        其他程序段
        ;;
esac
#! /bin/bash

read -p "请输入0-3的数值:" data
case $data in
    0)
    echo "data = 0"
    ;;
    1)
    echo "data = 1"
    ;;
    2)
    echo "data = 2"
    ;;
    *)
    echo "输入数值非法"
    ;;
esac

brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入0-3的数值:2
data = 2
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入0-3的数值:10
输入数值非法
#! /bin/bash

read -p "请输入你的选择:" choice

case "$choice" in
    Y | YES | yes | y | Yes)
    echo "It is right"
    ;;
    N* | n*)
    echo "It is wrong"
    ;;
    *)
    exit 1
esac

brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入你的选择:y
It is right
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入你的选择:ne
It is wrong

3、for循环语句

格式一:

for (( 初始值; 限制值; 执行步阶 ))
do
    程序段
done

初始值:变量在循环中的起始值

限制值:当变量值在这个限制范围内时,就绩效进行循环

执行步阶:每做一次循环时,变量的变化量

这里插入一个知识点:declare

declare 是 bash 的一个内建命令,可以用来声明 shell 变量、设置变量的属性。declare 也可以写作 typeset。

declare -i s 代表强制把 s 变量当做 int 型参数

案例1:求0~100的和

#! /bin/bash

declare -i i=0
declare -i sum=0

for (( i=0,sum=0; i<=100; i++ ))
do
    sum=$sum+$i
done

echo "sum=$sum"

brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
sum=5050

格式二:

for var in con1 con2 con3 ...
do
    程序段
done

第一次循环时,$var的内容为con1

第二次循环时,$var的内容为con1

第三次循环时,$var的内容为con1

....................

#! /bin/bash

for data in 1 2 3 4 5
do
    echo "data=$data"
done

brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
data=1
data=2
data=3
data=4
data=5

案例1:判断当前路径下的文件是否是文件或目录

#! /bin/bash

for filename in `ls`
do
    if [ -f $filename ];then
        echo "$filename是普通文件"
    elif [ -d $filename ];then
        echo "$filename是文件夹"
    fi
done

brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
a.out是普通文件
c00.c是普通文件
c01.c是普通文件
c02.c是普通文件
c03.c是普通文件
c04.c是普通文件
c05.c是普通文件
c06.c是普通文件
c07.c是普通文件
c08.c是普通文件
core是普通文件
c.txt是普通文件
shell00.sh是普通文件

4、while循环语句

while [ condition ]
do
    程序段
done

 当confition成立的时候进入while循环,直到condition不成立时才退出循环。

#! /bin/bash

declare -i i=0
declare -i sum=0
while [ $i -le 100 ]
do
    sum=$sum+$i
    i=$i+1
done

echo "sum=$sum"

brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
sum=5050

5、until语句

until [ conditon ]
do
    程序段
done

这种方式与while恰恰相反,当condition成立的时候退出循环,否则继续循环。

#! /bin/bash

declare -i i=0
declare -i sum=0
until [ $i -gt 100 ]
do
    sum=$sum+$i
    i=$i+1
done

echo "sum = $sum"

brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
sum = 5050

6、break continue

break:

        break 命令允许跳出循环。 break 通常在进行一些处理后退出循环或 case 语句

contiune:

        continue 命令类似于 break 命令 只有一点重要差别,它不会跳出循环,只是跳过这个循环步骤

知识点6【 函数 】(重要)

1、函数的定义形式

function my_add()
{
    # 判断两个参数
    if [ $# -eq 2 ];then
        return $1+$2
    else
        echo "必须是两个参数"
    fi
}

2、函数的调用

my_add $data1 $data2

3、完整代码

#!/bin/bash
# 函数的定义
function my_add()
{

    # 判断两个参数
    if [ $# -eq 2 ];then
        ((a=$1+$2))
        return $a 
    else
        echo "必须是两个参数"
    fi
}

read -p "请输入两个数值:" data1 data2

#函数调用
my_add $data1 $data2

#获取函数的返回值
echo "函数的结果:$?"

4、shell函数分文件

06_fun.sh

#!/bin/bash
# 函数的定义
function my_add()
{

    # 判断两个参数
    if [ $# -eq 2 ];then
        a=`expr $1 + $2`
        return $a 
    else
        echo "必须是两个参数"
    fi
}

06_shell.sh

#!/bin/bash

# 包含其他脚本内容
source 06_fun.sh

read -p "请输入两个数值:" data1 data2

#函数调用
my_add $data1 $data2

#获取函数的返回值
echo "函数的结果:$?"

知识点7【变量的扩展】

1、判断变量是否存在

#! /bin/bash

#${num:-val} 如果num存在, 整个表达式的值为num, 否则为val
echo ${num:-100} #100
num=200
echo ${num:-100} #200
#! /bin/bash

#${num:=val} 如果num存在, 整个表达式的值为num, 否则为val, 并将num赋值为al
echo ${num:=100} #100
echo "num=$num" #100

2、字符串的操作

#! /bin/bash

str="hehe:haha:xixi:lala"

#测量字符串长度 {#str}
echo "str长度为:${#str}" #19

#从下标为3的位置提取${str:3}
echo ${str:3} #"e:hehe:xixi:lala"

#从下标为3的位置提取长度为6字节
echo ${str:3:6} #"e:haha"

#${str/old/new} 用new替换出现的第一个old
echo ${str/:/#} #"hehe#haha:xixi:lala"

#${str//old/new} 用new替换所以old
echo ${str//:/#} #"hehe#haha#xixi#lala"

brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
str长度为:19
e:haha:xixi:lala
e:haha
hehe#haha:xixi:lala
hehe#haha#xixi#lala

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值