目录
一.从用户输入获取参数(也可以看作是特殊变量)
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 | 命令历史中包含的最大行数 |
HISTSIZE | history命令输出的记录数 |
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
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
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