快速入门
Shell是什么
Shell
是一个命令行解释器,它为用户提供了一个向Linux内核
发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序.
脚本格式
- 脚本以
#!/bin/bash
开头 - 脚本需要有可执行权限
#!/bin/bash
echo "hello,world~"
脚本的常用执行方式
√方式1(输入脚本的绝对路径或相对路径)
说明:首先要赋予helloworld.sh脚本的+x权限,再执行脚本
[root@bedo19c shcode]# chmod u+x hello.sh
[root@bedo19c shcode]# ./hello.sh
hello,world~
使用绝对路径/root/shcode/hello.sh
[root@bedo19c shcode]# /shcode/hello.sh
hello,world~
√方式2(sh+脚本)
说明:不用赋予脚本+x权限,直接执行即可。比如sh hello.sh,也可以使用绝对路径
[root@bedo19c shcode]# chmod u-x hello.sh
[root@bedo19c shcode]# sh hello.sh
hello,world~
shell变量
shell变量介绍
- Linux Shell中的变量分为,系统变量和用户自定义变量。
- 系统变量:
$HOME、$PWD、$SHELL、$USER
等等,比如:echo $HOME
等等… - 显示当前shell中所有变量:
set
shell变量的定义
- 定义变量:
变量名=值
- 撤销变量:
unset变量
- 声明静态变量:
1readonly变量,注意:不能unset
示例:
#!/bin/bash
#1.定义变量A
A=100
#输出需要加上$
echo A=$A
echo "A=$A"
#2.撤销变量A
unset A
echo "A=$A"
#3.声明静态变量B=2,不能unset
readonly B=2
echo "B=$B"
#4.将指令返回的结果赋给变量
C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"
结果:
[root@bedo19c shcode]# ./var.sh
A=100
A=100
A=
B=2
C=Mon Oct 17 16:02:14 EDT 2022
D=Mon Oct 17 16:02:14 EDT 2022
设置环境变量
- export 变量名-变量值 (功能描述:将shell变量输出为环境变量/全局变量)
- source配置文件 (功能描述:让修改后的配置信息立即生效)
- echo $变量名 (功能描述:查询环境变量的值)
位置参数变量
$n
(功能描述:n为数字,$0
代表命令本身,$1-$9
代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
)
$*
(功能描述:这个变量代表命令行中所有的参数,$*
把所有的参数看成一个整体)
$@
(功能描述:这个变量也代表命令行中所有的参数,不过$@
把每个参数区分对待)
$#
(功能描述:这个变量代表命令行中所有参数的个数)
示例:
#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有参数=$*"
echo "$@"
echo "参数的个数=$#"
结果:
[root@bedo19c shcode]# ./myshell.sh 100 200
0=./myshell.sh 1=100 2=200
所有参数=100 200
100 200
参数的个数=2
预定义变量
$$
(功能描述:当前进程的进程号(PID) )$!
(功能描述:后台运行的最后一个进程的进程号(PID))$?
(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行,如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
示例:
#!/bin/bash
echo "当前执行的进程 id=$$"
#以后台的方式运行一个脚本,并获取他的进程号
/shcode/myshell.sh &
echo "最后一个后台方式运行的进程id=$!"
echo "执行的结果是=$?"
结果:
[root@bedo19c shcode]# ./preVar.sh
当前执行的进程 id=23091
最后一个后台方式运行的进程id=23092
执行的结果是=0
运算符
基本语法
$((运算式))
或$[运算式]
expr m + n
表达式,注意 expr运算符间要有空格,如果希望将expr的结果赋给某个变量,使``
应用实例
#!/bin/bash
#案例1:计算(2+3)*4的值
#使用第一种方式
RES1=$(((2+3)*4))
echo "$RES1"
#使用第一种方式,推荐使用
RES2=$[(2+3)*4]
echo "res2=$RES2"
#使用第三种方式,expr
TEMP=`expr 2 + 3`
RES3=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res3=$RES3"
[root@bedo19c shcode]# ./oper.sh
20
res2=20
temp=5
res3=20
—————————————————————————————————————————
#!/bin/bash
#案例2:求出命令行的两个参数的和
SUM=$[$1+$2]
echo sum="SUM"
[root@bedo19c shcode]# ./oper1.sh 20 30
sum=50
选择
基本语法
if [ condition ]
then
fi
(**注意condition前后要有空格**)
非空返回true,可使用$?
验证(0为true,>1为false)
常用判断条件
- =字符串比较
- 两个整数的比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于 - 按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限 - 按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
示例:
#!/bin/bash
#1.判断ok否=ok
if [ "ok"="ok" ]
then
echo "equal"
fi
#2.判断23是否大于等于22
if [ 23 -ge 22 ]
then
echo "大于等于"
fi
#3.判断文件是否存在
if [ -f /shcode/myshell.sh ]
then
echo "存在"
fi
if [ hello ]
then
echo "hello"
fi
[root@bedo19c shcode]# ./ifdemo.sh
equal
大于等于
存在
hello
if判断
#!/bin/bash
#案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出"及格了",如果小于60,则输出"不及格"
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
[root@bedo19c shcode]# ./ifcase.sh 70
及格了
[root@bedo19c shcode]# ./ifcase.sh 50
不及格
注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格
case语句
#!/bin/bash
#案例1:当命令行参数是1时,输出"周一",是2时,就输出"周二",其它情况输出 "other"
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac
[root@bedo19c shcode]# ./testcase.sh 1
周一
[root@bedo19c shcode]# ./testcase.sh 2
周二
[root@bedo19c shcode]# ./testcase.sh
other...
循环
for循环
-
基本语法1
for 变量 in 值1 值2 值3…
do
程序/代码
done
#!/bin/bash
#案例1:打印命令行输入的参数「这里可以看出$*和$@的区别]
#注意$*是把输入的参数,当做一个整体,所以,只会输出一句
for i in "$*"
do
echo "num is $i"
done
#使用$@来获取输入的参数,注意,这时是分别对待,所以有几个参数,就输出几行
echo "=========================="
for j in "$@"
do
echo "num is $j"
done
[root@bedo19c shcode]# ./testFor.sh 100 200 300
num is 100 200 300
==========================
num is 100
num is 200
num is 300
-
基本语法2
for (( 初始值;循环控制条件;变量变化 ))
do
程序/代码
done
#!/bin/bash
#从1加到100
SUM=0
for(( i=1; i<=$1; i++ ))
do
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"
[root@bedo19c shcode]# ./testFor2.sh 100
SUM=5050
while循环
-
基本语法
while [ 条件表达式 ]
do
程序/代码
done
#案例:从命令行输入一个数n,统计从1+..+ n的值是多少?
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "执行结果=$SUM"
函数
#案例1:计算输入两个参数的和(动态的获取),getSum
#!/bin/bash
function getSum() {
SUM=$[$n1+$n2]
echo "两数之和是$SUM"
}
#输入两个值
read -p "输入n1=" n1
read -p "输入n2=" n2
#调用自定义函数
getSum $n1 $n2
[root@bedo19c shcode]# ./testFunc.sh
输入n1=10
输入n2=90
两数之和是100