SHELL编程
一、快速入门
-
脚本以 #!/bin/bash 开头:告诉解释器以bash来解析脚本;
编写myshell.sh文件:
#!/bin/bash echo "Hello World" /*输出结果是 Hello World
chmod a+x myshell.sh /*用来给脚本添加权限
二、SHELL变量
-
变量分类:
1.自定义变量:A="Hello World"等等;
2.系统变量: H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER 等等;
-
自定义变量:
1.定义变量:变量=值 注意:等号两边没有空格;(变量的设置 一般采用大写)
2.引用变量:$变量 或者 ${变量}
3.撤销变量:unset 变量
4.生命静态变量readonly:readonly 变量 注意:静态变量不能unset;
A="Hello" echo "A=${A}" /* 输出结果是 A=Hello unset A /* 撤销变量 A echo "A=${A}" /* 输出结果是 A=
-
将命令的返回值赋给变量
1.变量名=
命令
:运行反引号
里面的命令,并将结果赋值给变量;2.变量名= ( 命 令 ) : 反 引 号 可 以 用 (命令):反引号可以用 (命令):反引号可以用代替
RESULT='ll -a' /*将Linux指令(列出所有文件,包含隐藏文件)交给变量RESULT echo "RESULT=${RESULT}" /*输出结果是 #注意:这里的命令一定要用 反引号
DATE=$(date) /*查看系统当前的时间
echo $DATE /* 系统会输出当前的时间
-
设置环境变量
1.export 变量名=变量值 (功能描述:将shell变量输出为环境变量);
2.source 配置文件 (功能描述:让修改后的配置信息立即生效);
3.echo $变量名 (功能描述:查询环境变量的值);
-
位置参数变量
作用:当我们执行一个shell脚本时,如果想要获取到命令行的参数信息,就可以使用位置参数变量;
语法:
-
$n:(功能描述:n 为数字,$0 代表命令本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9 代表第一到第九个参数,十 以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10});
-
∗ : ( 功 能 描 述 : 这 个 变 量 代 表 命 令 行 中 所 有 的 参 数 , *:(功能描述:这个变量代表命令行中所有的参数, ∗:(功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体);
-
@ : ( 功 能 描 述 : 这 个 变 量 也 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @:(功能描述:这个变量也代表命令行中所有的参数,不过 @:(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待);
-
$ #:(功能描述:这个变量代表命令行中所有参数的个数);
echo "输入的命令: $0 ; 参数是: $1 "
echo "输入的命令行中所有的参数是: $*"
echo "输入的命令行 的所有参数: $@"
echo "输入的命令行的参数个数: $#"
-
预定义变量
介绍:shell设计者预先定义好的变量,可以直接在shell脚本中使用;
语法:
1.$$: (功能描述:当前进程的进程号(PID));
2.$!: (功能描述:后台运行的最后一个进程的进程号(PID));
3.$?:(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令 执行不正确了。)
三、运算符
1." ( ( 运 算 式 ) ) " 或 " ((运算式))" 或 " ((运算式))"或"[运算式]";
2.expr m + n:加法 注意:expr运算符间要有空格,并且整条语句要在反引号内;
3.expr m - n:减法
4.expr *, /, %:乘 除 取余
-
(
)
与
()与
()与{}的区别 $( )的用途和反引号``一样,用来表示优先执行的命令 eg: echo $(ls /root)
${ } 就是取变量了 eg:echo ${PATH}
$((运算内容)) 适用于数值运算 eg: echo $((3+1*4))
A=${((3+2)*2)} /*用于计算 (3+2)*2
echo "A计算的结果是:$A"
B=`expr 2 + 4`
echo "B计算的结果是:$B"
C=`expr $B / 3`
echo "C计算的结果是:$C"
四、字符串
-
字符串不能单独,必须要配合变量。
-
字符串可以使用单引号[’ '],也可以使用双引号[" "],也可以不用引号
-
单引号内的任何字符没有任何意义,都会原样输出,
-
单引号内使用变量是无效的,单引号内不能出现单引号
-
双引号内可以使用变量
-
双引号内可以使用转义字符
-
在字符串拼接操作时,我们可以进行无缝拼接,或者是在双引号里使用变量
################注意:::以上是单引号和双引号的区别:::###############
五、数组
- 在/bin/bash这个shell中,只有一维数组的概念,并且不限定数组的长度。
- 数组的元素下标是从0开始的,
- 获取数组的元素要使用下标
- 下标使用不当,会报错
-
定义格式: variable=(值1 值2 … 值n) 注意:元素之间除了使用空格作为分隔符,还可以使用
-
${variable[index]}: 读取index索引上的元素
-
v a r i a b l e [ ∗ ] 或 者 {variable[ * ]}或者 variable[∗]或者{variable[@]}:读取所有元素*
-
KaTeX parse error: Expected '}', got '#' at position 2: {#̲variable[*]}或者{#variable[@]} : 读取数组的长度
#!/bin/bash citys=(cc sh bj sd hlj) hobby[0]=book hobby[1]=film hobby[2]=music echo ${citys[0]} <==cc echo ${hobby[*]} <==book film music echo ${#hobby[@]} <==3
六、条件判断
- 整数比较:
操作符 | 作用 |
---|---|
= | 比较两个字符串 |
-lt | 小于 |
-le | 小于等于 |
-eq | 等于 |
-gt | 大于 |
-ge | 大于等于 |
-ne | 不等于 |
- 按照文件权限比较
操作符 | 作用 |
---|---|
-r | 有读的权限 |
-w | 有写的权限 |
-x | 有执行的权限 |
- 按照文件类型比较
操作符 | 作用 |
---|---|
-f | 文件存在并且是一个常规文件 |
-e | 文件存在 |
-d | 文件存在并且是一个目录 |
if [ 条件判断式 ]
then
程序
fi
--------------------------------------------------------------------------------
!#/bin/sh
if [ -x /etc/rc.d/init.d/httpd ]
then
/etc/rc.d/init.d/httpd restart
fi
if条件语句-多分枝
if [ 条件判断式1]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件
else
当所有条件都不成立时,最后执行此程序
fi
-----------------------------------------------------------------------------
#!/bin/bash
read -p "please input your name:" NAME
echo $NAME
if [ “$NAME” == root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME == tom ]
then
echo "hello ${NAME}, welcome !"
else
echo "SB, get out here !"
fi
case
CMD=$1
case $CMD in
start)
echo "starting"
;;
stop)
echo "stoping"
;;
test)
echo “I’m testing”
;;
*)
echo "Usage: {start|stop} "
;;
esac
七、循环
for循环
for N in 1 2 3
do
echo $N
done
for N in 1 2 3;
do
echo $N;
done
for N in {1..3};
do
echo $N;
done
for N in 1 2 3;
do
echo $N;
done
以上均为 for 循环的第一种书写方式
for ((i = 0; i <= 5; i++))
do
echo "welcome $i times"
done
for ((i = 0; i <= 5; i++));
do
echo "welcome $i times";
done
以上是for 循环的第二种书写方式
while循环
-
注意:until循环与while正好相反,即:while是条件成立循环执行;until是条件不成立循环执行
while命令根据紧跟其后的命令(command)来判断是否执行while循环,
当command执行后的返回值(exitstatus)为0时,则执行while循环语句块,直到遇到done语句,然后再返回
到while命令,判断command的返回值,当得打返回值为非0时,则终止while循环。
while [ expression ] do command … done
while (( expression )) do command … done
八、函数
-
函数代表着一个或一组命令的集合,表示一个功能模块,常用于模块化编程。
以下是关于函数的一些重要说明:- 在shell中,函数必须先定义,再调用
- 使用return value来获取函数的返回值
- 函数在当前shell中执行,可以使用脚本中的变量。
函数的格式如下:
函数名() { 命令1….. 命令2…. return 返回值变量 }
[ function ] funname [()] { action; [return int;] } function start() / function start / start()
注意:
- 如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。
- 函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回值
- 如果不加return,将以最后一条命令的运行结果,作为返回值。
- return后的内容以字符串的形式写入,但是执行时会自动转成数值型,范围:数值n(0-255)
#!/bin/bash
function sum(){
A=$1
B=$2
C=$3
return $[ A + B +C ]
}
sum $1 $2 $3
SUM=$?
echo $SUM
注意:
- 如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。
- 函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回值
- 如果不加return,将以最后一条命令的运行结果,作为返回值。
- return后的内容以字符串的形式写入,但是执行时会自动转成数值型,范围:数值n(0-255)
#!/bin/bash
function sum(){
A=$1
B=$2
C=$3
return $[ A + B +C ]
}
sum $1 $2 $3
SUM=$?
echo $SUM