Shell脚本接收位置参数,变量的定义和运算、流程控制语句演示

目录

一.从用户输入获取参数(也可以看作是特殊变量)

1.通过$符号配合*、#、数字等来获取

2.通过read (-p)来获取

二.Shell中的变量

1.定义变量和查看变量

2.变量的类型

(1)局部变量,也叫普通变量,只在某个特定范围内生效的变量

(2)全局变量,也叫环境变量,可以在shell和shell派生的子进程中使用

(3)字符串变量

(4)整数变量

(5)数组变量

 3.变量运算

(1)$(())

(2)$[ ]

(3)let命令

(4)expr工具

(5)bc工具

(6)awk 

(7)declare

4.变量中字符串处理

三.流程控制语句

1.if语句的格式及写法

(1)if语句-单分支

(2)if语句-多分支

2.for循环语句的写法

(1)常用格式演示

(2)举例演示

3.while循环语句的介绍

(1)格式演示

(2)举例演示

4.case语句写法

(1)格式演示

(2)举例演示


一.从用户输入获取参数(也可以看作是特殊变量)

1.通过$符号配合*、#、数字等来获取

(1)$0表示当前脚本文件名称

[root@sulibao ~]# vim aaa.sh
#!/bin/bash
echo "这个脚本文件名称为$0"
[root@sulibao ~]# bash aaa.sh 
这个脚本文件名称为aaa.sh

(2)${1.....},表示第几个参数,$1表示第一个参数,用户输入参数时参数间以空格相隔

在运行脚本文件时指定第几个参数

[root@sulibao ~]# vim aaa.sh
#!/bin/bash
echo "这个脚本文件名称为$0"
echo "今年上$1年级"
echo "我的邮箱地址是$2"
[root@sulibao ~]# bash aaa.sh 二 666.com
这个脚本文件名称为aaa.sh
今年上二年级
我的邮箱地址是666.com

(3)$#表示统计当前参数总数

[root@sulibao ~]# vim aaa.sh
#!/bin/bash
echo "这个脚本文件名称为$0"
echo "今年上$1年级"
echo "我的邮箱地址是$2"
echo "参数有$#个"
[root@sulibao ~]# bash aaa.sh 二 666.com
这个脚本文件名称为aaa.sh
今年上二年级
我的邮箱地址是666.com
参数有2个

(4)$*表示以整体,“参数1 参数2 参数2”这样的形式返回参数的值

(5)$@表示以个体,“参数1”“参数2”这样的形式返回参数的值 

2.通过read (-p)来获取

(1)read  变量,再配合$变量将其输出

[root@sulibao ~]# vim aaa.sh
#!/bin/bash
read name
echo $name
[root@sulibao ~]# bash aaa.sh           //用户输入内容后输入输出这个内容
su
su

(2)read配合参数-p可以设置提示输入信息

[root@sulibao ~]# vim aaa.sh
#!/bin/bash
read -p "请输入你的名字:" name
echo "你的名字是: $name"
[root@sulibao ~]# bash aaa.sh
请输入你的名字:su
你的名字是: su

(3)可以指定多个变量,变量间以空格相隔

[root@sulibao ~]# vim aaa.sh
#!/bin/bash
read -p "请输入你的名字和年龄:" name age
echo "你的名字是: $name,你今年$age岁"
[root@sulibao ~]# bash aaa.sh
请输入你的名字和年龄:su 20
你的名字是: su,你今年20岁

二.Shell中的变量

1.定义变量和查看变量

(1)命令行定义

  • 变量名='值'
  • 变量名="`命令`"
  • 变量名="$(命令)"

(2)文件中定义

  • 当前用户生效:

~/.bashrc和~/.bash_profile

  • 所有用户生效:

/etc/bashrc,/etc/profile,/etc/profile.d/*.sh

(3)查看变量

注意:

$表示将后面的字符识别为一个变量

\会将特殊字符转义使特殊字符失去原有含义

反单引号将内容识别为一个命令

单引号让里面的特殊字符失效

双引号让里面的特殊字符失去原有含义(除了$,反引号,\)

  • echo $变量名
  • echo ${变量名}
  • printf "$变量名\n"
  • printf "${变量名}\n"
  • set和declare命令可以查看所有的变量和函数
  • env命令可以显示是所有的全局变量

2.变量的类型

(1)局部变量,也叫普通变量,只在某个特定范围内生效的变量

  • 命令行中的就在当前进程中生效
  • 在脚本文件中就在当前脚本文件中生效

可以通过unset 变量名来取消变量名  

(2)全局变量,也叫环境变量,可以在shell和shell派生的子进程中使用

  • 通过export 变量名或者export 变量名=值进行临时设置
  • declare -x 变量名=值或declare +x 变量名来取消全局变量

内置的环境变量

变量含义
PATH命令的搜索路径
HOME用户的家目录的路径
COLUMNS命令行编辑模式下可使用命令的长度
HISTFILE命令历史的文件路径
HISTFILESIZE命令历史中包含的最大行数
HISTSIZEhistory命令输出的记录数
LOGNAME当前用户的名字
SHELL当前使用的shell
PWD当前的工作目录

(3)字符串变量

使用单引号,双引号,三引号基本都可以

单引号是告诉 Shell 忽略特殊字符(是什么就输出什么),而双引号则解释特殊符号原有的意义
[root@localhost sh]# cat string.sh 
#!/bin/bash 
first='hello'
second="world"
third='''w'''
echo ${first}
echo ${second}
echo ${third}

(4)整数变量

可以将变量直接声明为整数,也可以通过declare -i将其声明为整数,若是非整数时会报错。

[root@localhost sh]# cat int.sh 
#!/bin/bash
num=23    #直接声明
echo $num

declare -ir a=1    #-r又表示将其声明为只读变量,在后面不可更改,此处的a就不会被更改为6
a=6
echo $a

(5)数组变量

可以直接声明为普通数组,也可以通过declare -A声明为关联数组(类似于键值对)

[root@localhost sh]# cat array.sh 
#!/bin/bash
a1=(1 2 3 4 5 6) #普通数组
echo ${a1:0}
#关联数组的定义
declare -A my_array=(["name"]="sulibao" ["age"]="21" ["sex"]="man"); echo "第一个键值对的值为: ${my_array["name"]}"

 3.变量运算

(1)$(())

将$写在(())外面,括号内为变量时可以省去$,用于整数运算,不支持小数(浮点数)

[root@sulibao sh]# vim aaa.sh
#!/bin/bash
read  num1 num2
result=$((num1 + num2))
echo $result
[root@sulibao sh]# bash aaa.sh 
3 6
9

(2)$[ ]

将$写在[ ]外面,[ ]内变量可以加$也可以不加$,不影响结果,用于整数运算,不支持(小数)浮点数

[root@sulibao sh]# vim aaa.sh
#!/bin/bash
read  num1 num2
result=$[num1 + num2]
echo $result
[root@sulibao sh]# bash aaa.sh 
3 6
9

(3)let命令

let可以实现变量前不需要使用$指定,同时也可以使用let命令实现自增和自减,用于整数运算,不支持小数(浮点数)

[root@sulibao sh]# vim aaa.sh
#!/bin/bash
read  num1 num2
let result=num1+num2
echo $result 
[root@sulibao sh]# bash aaa.sh 
3 6
9

自增,自减

[root@sulibao sh]# vim aaa.sh
#!/bin/bash
read  num1 num2
let num1--
let num2++
echo $num1 $num2 
[root@sulibao sh]# bash aaa.sh 
3 6
2 7

(4)expr工具

只支持整数运算,不支持小数(浮点数),运算符号和数字左右两边都应该以空格隔开,使用乘号(*)时,需要实用反斜线(\)屏蔽特殊含义

使用反引号

[root@sulibao sh]# vim aaa.sh
#!/bin/bash
read  num1 num2
result=`expr $num1 +  $num2`
echo $result
[root@sulibao sh]# bash aaa.sh 
3 6
9

配合$和() 

 [root@sulibao sh]# vim aaa.sh
#!/bin/bash
read  num1 num2
result=$(expr $num1 +  $num2)
echo $result
[root@sulibao sh]# bash aaa.sh 
3 6
9

特殊用法

使用expr将一个位置变量和一个已知整数相加,返回值为0则该变量类型为整数,否则不为整数

(5)bc工具

bc配合 | 使用,表示将前面打印的结果传给bc工具进行处理

#!/bin/bash
read  num1 num2
result=`echo "scale=2;$num1 + $num2" | bc`
echo $result 

#num1与num2相加,scale=2表示保留两位小数(后面一定要加;),如果不设置默认保留一位

bc工具进行数学运算支持整数和浮点数

[root@sulibao sh]# bash aaa.sh 
6.6 6.6
13.2

(6)awk 

可以用于整数运算和小数运算

[root@sulibao sh]# awk  'BEGIN {print 3+3*2}'
9

(7)declare

定义变量的值和属性,-i定义整形变量作运算

[root@sulibao sh]# declare -i a=3+2
[root@sulibao sh]# echo $a
5

4.变量中字符串处理

${变量}返回变量的内容
[root@redhat9 ~]# echo ${a}
666
${#变量}返回变量的内容的长度,字符长度
[root@redhat9 ~]# echo ${#a}
3
${变量:location}在这个变量中,从“location”之后开始提取字符串直到结尾
[root@redhat9 ~]# b=dhvkvmd
[root@redhat9 ~]# echo ${b:3}
kvmd
${变量:location:length}在这个变量中,从“location”之后提取多少长度的字符串
[root@redhat9 ~]# echo ${b}
dhvkvmd
[root@redhat9 ~]# echo ${b:3:2}
kv
${变量#*word}从变量开头起删除匹配最短的“word”及其前字符串
[root@redhat9 ~]# echo ${d}
nkasnkasjilo
[root@redhat9 ~]# echo ${d#*as}
nkasnkasjilo
${变量##*word}从变量开头起删除匹配最长的“word”及其前的字符串
[root@redhat9 ~]# echo ${d}
nkasnkasjilo
[root@redhat9 ~]# echo ${d##*as}
jilo
${变量%word*}从变量结尾起删除匹配最短的“word”及其后的字符串
[root@redhat9 ~]# echo ${d}
asnkasnkasjilo
[root@redhat9 ~]# echo ${d%as*}
asnkasnk
${变量%%word*}从变量结尾起删除匹配最长的“word”及其后的字符串
[root@redhat9 ~]# echo ${d%%nk*}
as
${变量/word/string}让string替换变量中匹配到的第一个word
[root@redhat9 ~]# echo ${b}
dhvkvmd
[root@redhat9 ~]# echo ${b/v/a}
dhakvmd
${变量//word/string}让string替换匹配到的所有word
[root@redhat9 ~]# echo ${b//v/a}
dhakamd

三.流程控制语句

1.if语句的格式及写法

(1)if语句-单分支

if [   ]

        then

fi                       

#!bin/bash
if [ 可以写一些测试语句 ]
        then 需要执行的操作
fi   

举例演示

测试根目录下是否存在/su,如果不存在就在根目录下创建/su

[root@sulibao ~]# ll / | grep su
[root@sulibao ~]# vim text.sh 
#!bin/bash
if [ ! -e /su ]
        then mkdir /su
fi
[root@sulibao ~]# bash text.sh 
[root@sulibao ~]# ll / | grep su
drwxr-xr-x    2 root root    6 Jan 13 20:23 su

(1)if语句-双分支

if [   ]

        then

        else

fi

#!bin/bash
if [ 可以写一些测试语句 ]
        then     符合条件执行的命令
        else     不符合条件执行的命令
fi

举例演示

 用户输入一个字符,如果等于“a”就输出yes,否则输出no

[root@sulibao ~]# vim text.sh 
#!bin/bash
read -p "请输入一个字符:" string
if [ $string = "a" ]
        then
                echo yes
        else
                echo no
fi
[root@sulibao ~]# bash text.sh 
请输入一个字符:a
yes
[root@sulibao ~]# bash text.sh 
请输入一个字符:d
no

(2)if语句-多分支

if [   ]

        then

elif [   ]

        then

else

fi

#!bin/bash
if [ 可以写一些测试语句 ]
        then     需要执行的命令1
elif [ 可以写一些测试语句 ]
        then     需要执行的命令2
else            
        需要执行的命令3
fi  

举例演示 

使用if多分支判断100内分数等级,作排除字母和特殊字符处理

[root@sulibao sh]# vim chengji.sh 
#!/bin/bash
read -p "请输入您的成绩:" score
if echo "$score"|grep "[a-zA-Z]">/dev/null
        then
        printf "输入错误,请重新输入!"
elif echo "$score"|grep "[0-9]">/dev/null
        then
        if [ $score -gt 100 ] || [ $score -lt 0 ]
                then
                printf "输入值超出范围,请重新输入!"
        elif [ $score -ge 85 ]
                then
                printf "A"
        elif [ $score -ge 70 ]
                then
                printf "B"
        elif [ $score -ge 60 ]
                then
                printf "C"
        else
                printf "D"
        fi
else
        printf "输入错误,请重新输入!"
fi

2.for循环语句的写法

(1)常用格式演示

for   变量   in

        do

done

#!bin/bash
for 变量 in 值/值列表/值文件
        do
        执行的命令
done

(2)举例演示

 常用写法打印九九乘法表

#!/bin/bash
for i in `seq 9`
        do
                for j in `seq $i`
                        do
                                printf "$j*$i=%2d " $((j*i))
                        done
                        echo ""
        done

 类C写法打印九九乘法表

#!/bin/bash
for((i=1;i<10;i++))
        do
                for((j=1;j<=$i;j++))
                        do
                                printf "$j*$i=%2d " $((j*i))
                        done
                        echo ""
        done

1b6b83f712fb4700a92b1a0817fd5d86.png

3.while循环语句的介绍

(1)格式演示

写法不唯一,这里仅演示以下一种写法

while [   ]

        do

done

#!bin/bash
while [ 可以写一些条件测试语句 ]
        do
               需要执行的语句
done

(2)举例演示

 以1为初始值,通过自加循环输出小于10的结果

[root@sulibao ~]# vim text.sh 
#!bin/bash
x=1
while [ $x -lt 10 ]              //当条件测试语句成立时才执行do内的内容
        do
                echo $x
                ((x++))
done
[root@sulibao ~]# bash text.sh 
1
2
3
4
5
6
7
8
9

使用while打印九九乘法表

#!bin/bash
i=1
while ((i<10))
        do
                j=1
                while ((j<=i))
                        do
                                printf "$j*$i=%2d " $((j*i))
                                let j++
                        done
                        echo ""
                        let i++
        done

c99da9c1d02a4d9b82fee641159577d4.png

4.case语句写法

(1)格式演示

case " " in
        模式1)
                ;;                                   
        模式2)
                ;;
        *)                         
esac

#!bin/bash
case "" in                            //""引号内写匹配目标
    模式1)                         //模式后需要以)结束
      执行命令1
      ;;                    //结束标志
    模式2)
      执行命令2
      ;;
    *)                           //其他模式(其他匹配项)
      执行命令3
esac                                   //结束对应符号
                                      

(2)举例演示

使用case语句判断100内分数等级,作排除字母和特殊字符处理

#!/bin/bash
read -p "请输入您的分数:" score
if echo "$score"|grep "[a-zA-Z]">/dev/null
        then
        printf "输入错误,请重新输入!"
elif echo "$score"|grep "[0-9]">/dev/null
        then
        if [ $score -gt 100 ] || [ $score -lt 0 ]
                then
                printf "超出值范围,重新您输入!"
        else
                case "$score" in
                        [8-9][5-9]|100)
                        #第一个[]内表示十位,第二个[]内表示个位,|表示或的意思
                        echo "A"
                        ;;
                        [7-8][0-4])
                        echo "B"
                        ;;
                        [6][0-9])
                        echo "C"
                        ;;
                        *)
                        echo "D"
                esac
        fi
else
        printf "输入错误,请重新输入!"
fi

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树下一少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值