Shell 编程

# Shell解释

目录

1.1 Shell--定义变量

1.2 Shell--字符串操作

1.3 Shell--反引号的作用

1.4 Shell--编写及运行

1.5 Shell--动态传参

1.6 Shell-if语句入门

1.7 Shell--for循环讲解

1.8 Shell--while循环讲解

所谓的Shell编程, 就是在1个文件中写Linux代码, 然后通过Shell解析器来解析的过程. 
​
# 流程
在后缀名为.sh的文件中写Linux命令 => 执行该Shell脚本 => Shell解析器会解析该脚本 => 执行并查看结果

1.1 Shell--定义变量

# 变量解释
在程序的执行过程中, 其值可以在一定范围内发生改变的量, 就叫: 变量.
​
# 示例代码.
[root@node1 ~]# name=zhangsan       # 如果变量值没有空格, 可以直接写
[root@node1 ~]# echo name
name
​
[root@node1 ~]# hobby=eat shuij     # 如果字符串值有空格, 必须用引号包裹.
-bash: shuij: 未找到命令
​
[root@node1 ~]# hobby="BasketBall DeskBall PPQ"
[root@node1 ~]# echo $hobby
BasketBall DeskBall PPQ
​
# 演示删除变量.
[root@node1 ~]# name=hangge
[root@node1 ~]# echo $name
hangge
[root@node1 ~]# unset name      # 删除变量, 即使不删除, 重启服务器, 该变量也会被自动删除.
[root@node1 ~]# echo $name
​

1.2 Shell--字符串操作

# 结论: 以后定义字符串, 尽量使用双引号.
[root@node1 ~]# name=hangge
[root@node1 ~]# echo my name is '$name'
my name is $name
[root@node1 ~]# echo my name is 'name'
my name is name
[root@node1 ~]# 
[root@node1 ~]# echo my name is "$name"     # 双引号包裹的$有特殊意义, 单引号包裹则原样输出.也可以不使用
my name is hangge
[root@node1 ~]# 
[root@node1 ~]# echo 'my name is $name'
my name is $name

1.3 Shell--反引号的作用

要执行Linux命令, 则: 用反引号包裹或者用$()包裹
[root@node1 ~]# echo date
date
[root@node1 ~]# echo `date`         # 如果要执行Linux命令, 则: 用反引号包裹
2023年 05月 12日 星期五 11:28:15 CST
​
​
[root@node1 ~]# echo $(date)
2023年 05月 12日 星期五 11:28:23 CST  # 如果要执行Linux命令, 则: 用$()包裹
​
[root@node1 ~]# dt=`date`
[root@node1 ~]# echo $dt
2023年 05月 12日 星期五 11:29:00 CST
​
[root@node1 ~]# dt2=$(date)
[root@node1 ~]# echo $dt2
2023年 05月 12日 星期五 11:29:16 CST
​
# 扩展, 只读变量, 只能设置一次值, 不允许修改值, 不允许删除(重启虚拟机后会自动删除)
[root@node1 ~]# name=zhangsan
[root@node1 ~]# name=lisi
[root@node1 ~]# echo $name
lisi
[root@node1 ~]# readonly name   # 设置name变量为: 只读变量.
[root@node1 ~]# name=wangwu     # 只读变量不能修改值.
-bash: name: 只读变量
​
[root@node1 ~]# unset name      # 不能直接删除只读变量
-bash: unset: name: 无法反设定: 只读 variable
[root@node1 ~]# 

1.4 Shell--编写及运行

# 应用场景
Shell命令适合于 比较简单的业务场景, 执行之后, 如果关闭了CRT, Tabby, 则这些命令也会被清理掉.
Shell脚本适用于 比较复杂的业务场景, 执行之后, (Shell脚本)文件还在. 
​
# 如何编写Shell脚本? 
1. 在后缀名为 .sh 的文件中进行编写.
2. 第一行代码为: 指定用什么Shell解析器来解析该脚本, 一般写 #!/bin/bash
3. 除了第1行的#之外, 后续的#全部是 注释的意思.
4. 例如: 如下的Shell脚本, vim 1.sh
    #!/bin/bash
​
    # 如下是输出一些文字到控制台
    echo '故人西辞富士康, '
    echo '为学技术到蓝翔. '
    echo '蓝翔毕业包分配, '
    echo '尼玛还是富士康. '
​
    name='zhangsan'
    echo "我的名字叫: ${name}"
​
    dt=$(date)
    echo '当前的时间是 '$dt''
​
# 如何运行Shell脚本呢? 
1. sh 脚本名.sh        # 官方推荐,  不需要对Linux脚本有执行权.
2. source 脚本名.sh    # 野路子写法, 不需要对Linux脚本有执行权.
3. 相对路径.           # 必须对Linux脚本有执行权.
4. 绝对路径.           # 必须对Linux脚本有执行权.

1.5 Shell--动态传参

# 如下是和动态传参相关的内容
echo "当前的文件名是: $0"
echo "接收到的参数总个数为: $#"
echo "接收到的所有参数为: $*"
echo "第1个参数值为: $1"
echo "第2个参数值为: $2"
echo "第3个参数值为: $3"

1.6 Shell-if语句入门

数字:
        运算符         说明
        -eq         检测两个数是否相等,相等返回 true。
        -ne         检测两个数是否不相等,不相等返回 true。
        -gt         检测左边的数是否大于右边的,如果是,则返回 true。
        -lt         检测左边的数是否小于右边的,如果是,则返回 true。
        -ge         检测左边的数是否大于等于右边的,如果是,则返回 true。
        -le         检测左边的数是否小于等于右边的,如果是,则返回 true。
​
    字符串:
        判断符         说明
        -n          STRING  字符串长度不为零
        -z          STRING  字符串长度为0
        =           判断两个字符串是否一样
        !=          判断两个字符串是否不一样
​
    文件
        判断符         说明
        -f          存在且是普通文件
        -d          存在且是目录
        -h          存在且是符号链接 
        -e          文件存在 
        –r          文件存在并且可读
        –w          文件存在并且可写
        –x          文件存在并且可执行
​
if语句
    if 语句语法格式:
        if [ condition ]    //条件, 条件要用 [] 包裹.并且两把要有空格隔开
        then
            command1    //符合条件后, 就会执行这里的内容
            command2
            ...
            commandN 
        fi
​
注意: 不允许将以上格式 写成一行.
​
# 案例
案例1: 判断当前系统是否有多个ssh进程,如果有则打印true
test1.sh    //这是SHELL脚本文件, 以下是里边的内容. 
#!/bin/bash
if [ $(ps -ef | grep -c "ssh") -gt 1 ]      //这里的-c就是count的意思, 即: 统计个数的.                    
then 
    echo "true" 
fi
​
//上述的if也可以改成: if [ `ps -ef | grep -c "ssh"` -gt 1 ]  这种写法.
​
案例2: 判断/media/cdrom目录是否存在,若不存在就去创建这个目录
test2.sh    //这是SHELL脚本文件, 以下是里边的内容. 
#!/bin/bash 
DIR="/media/cdrom" 
if [ ! -d $DIR ] 
then 
    mkdir -p $DIR 
fi
​
#Shell--if-else语句
if else 语法格式:
    if condition    //条件, 用[]包裹
    then
        command1    //符合条件后, 执行的内容
        command2
        ...
        commandN
    else
        command     //不符合条件后, 执行的内容. 
    fi
    
#if语句结合test语法 替换[]
if test $age -ge 18
then
    echo '恭喜您, 成年了, 可以上网了!'
else
    # 3. 走这里是未成年, 进行相应的提示即可.
    echo '小屁孩儿, 滚回去学习!'
fi
​
#if-else if语句
if else-if else 语法格式:
    if condition1       # 条件1
    then
        command1        # 满足条件1后, 执行的内容
    elif condition2     # 条件2
    then 
        command2        # 满足条件2后, 执行的内容
    else
        commandN        # 所有条件都不满足, 则执行这里.
    fi

1.7 Shell--for循环讲解

# for格式1: 字符型循环.
格式:
    for 变量 in 值1 值2 值3…
    do
        程序
    done
示例:
    # 案例6: 演示for循环, 字符型循环.
​
    for i in 11 22 33
    do
        echo $i
    done
​
# for格式2: 数字型循环.
格式:
    for ((初始值;循环控制条件;变量变化))
    do
        程序
    done`
    
示例:
    # 需求:求1-100的和, for版
    sum=0
    # 2. 获取 1 ~ 100之间所有的整数.
    for ((i=1; i <= 100; i++ ))
    do
        # 3. 依次累加给变量sum
        # 思路: sum=sum + i
        # sum=$(($sum + $i))    # 写法1: $(( a + b ))
        # sum=$[$sum + $i]      # 写法2: $[ a + b ]
        sum=`expr $sum + $i`    # 写法3: `expr a + b`
    done
    # 4. 打印结果.
    echo "求和结果为: $sum"

1.8 Shell--while循环讲解

# 入门案例
#!/bin/bash
​
# 需求: while循环入门, 打印1 ~ 5数字
​
# 初始化条件
i=1
​
# 判断条件
while (( $i <= 5 ))
do
    # 循环体
    echo $i
    
    # 控制条件
    # i=$(($i + 1))
    # i=$[$i + 1]
    # i=`expr $i + 1`
    let "i++"   # let后边可以跟1个或者多个表达式, 表达式中的变量可以直接写, 不用写$符号了. 
done
​
# while求和
#!/bin/bash
​
# 需求:求1-100的和, while版
​
# 1. 定义求和变量, 记录求和结果
sum=0
i=1
​
# 2. 获取 1 ~ 100之间所有的整数.
while ((i <= 100))
do
    # 3. 依次累加给变量sum
    let sum=sum+i   # 求和
    let i++         # 自增
done
​
# 4. 打印结果.
echo "求和结果为: $sum
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值