Shell编程基本语法详解


Shell编程

介绍:

什么是shell脚本编程

shell是一个由C语言编写的,shell即是一种语言也是一种命令,是用户
和Linux沟通的桥梁,shell脚本(shell script)是一种为shell编写
的脚本语言,可以理解为一个可执行的Linux命令集合

shell解释器

shell编程和java,php等语言一样,只需要一个文本编辑器和一个解释器

常见的shell解释器:

bourne ba[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dashsh : /bin/sh

c shell /usr/bin/csh

bourne again shell /bin/bash

k shell /usr/bin/ksh

shell for root /sbin/sh

linux自带的是:/bin/sh ,/bin/bash /sbin/sh ,以上几种都是交互式。

bash 是易用和免费的,bash在日常工作中免费试用

bash也是大部分Linux,自带的解析起

查看linux系统安装的shells

[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash

执行shell脚本:

1、bash hell.sh

2、sh hell.sh

3、chmod a+x hell.sh 然后:./hello.sh

shell 变量

1、Linux shell 的变量分为系统变量和自定义变量

系统变量可以用set查看

列:

[root@localhost ~]# i=1
[root@localhost ~]# echo $i
1

2、自定义变量

规则:大写字母

[root@localhost ~]# A="hell world"
[root@localhost ~]# echo $A
hell world

[root@localhost ~]# echo "${A}SLKF"
hell worldSLKF
[root@localhost ~]#

双引号和单引号区别:双引号仅仅将空格脱意,可以取值,可以支持空格

单引号会将变量引用比如$pararm脱意

变量撤销:

unset A(之前定义的变量)

readonly B=2(定义常量不可改变不可撤销)

3、脚本的相互调用

1、export a; 可以把变量提升为当前shell进程中的全局变量,可供其他子shell进程调用

2、提升子进程的执行空间

. /root/scripte.sh

or

source /root/script.sh (把脚本加载导执行空间)

soure和. 的区别:

4、总结:

1、a.sh总直接调用b.sh, 会让b.sh在a所在的bash空间去创建一个子空间,执行b脚本

2、子空间只能访问夫空间的export提升过作用域的变量

3、一个shell进程无法将自己提升到夫空间去

4、” .“执行脚本时,会让脚本所在的bash进程中去执行

vi a.sh
##!/bin/bash
 export a="a is in a.sh"
echo  $a
sh /root/b.sh

vi b.sh
##!/bin/bash
b="b is in b.sh"
echo $b
echo $a
sh a.sh执行结果:
a is in a.sh
b is in b.sh
a is in a.sh



pstree显示树形进程

5、变量赋值:

1、反引号赋值:A=DATE反引号里面是命令

2、A =$(ls -al)

6、shell的特殊的变量

$? :表示上一个命令的返回状态(0是执行的正确) :echo $?

$$:表示当前的进程编号

$0:表示当前脚本名称

$n:表示第n 个参数(n从0开始依次加一)

$#:表示参数的个数:常用于循环

@ : @: @:*:参数列表:不确定参数的个数,可以直接使用这两个命令

$@ $* 参数列表,不确定参数个数,可直接使用这两个命令
区别
这两个命令都表示传递给函数的参数列表,不被双引号包含是
都是以$1 $2 3. 。 。 。 。 3.。。。。 3.n 的形式输出所有的参数
当他们被双引号包含时
“$*“会将所有参数作为一个整体,以”$1, 2... 2... 2...n“的 形式输出
”$@“会将各个参数分开,以”$1”," 2 " , . . . " 2",..." 2",..."n"的形式输

shell 运算符

1、用expr

格式:expr m+n 或者 $((m+n)).

注意:expr运算符中间必须有空格

例如 (2 + 3) * 4的值
分布
S=expr 2 + 3
S=expr $S \* 4
合并
S=expr \expr 2 + 2 ` * 4`

2、用(())

s=$(((2+2)*4))

3、$[]

s=$[(1=2)*4]

4、let

i=1

let i++

let i = i +2

流程控制语句

1、if语句

if [ condition ]

then

​ command;

fi

if [ $year -eq 1979 ] ;then echo "$year年"; let year--; fi

或者

if [ condition ]

then

​ command;

else

​ command

fi

或者

if []

then

​ command

elif[]

then

​ command

else

​ command

fi

[root@localhost ~]# year=1979
[root@localhost ~]# if [ $year -eq 1979 ]
> then
> echo "$year年 is 元年"
> elif [ $year -lt 1979 ]
> then
> echo "$year is old year"
> else
> echo "$year is new year"
> fi
1979年 is 元年

2、条件判断的基本语法

[condition]

注意:condition 前后必须有空格

if后紧跟then,else后没有

非空返回true,可以使用$?判断

内部的=前后要有空格,否则,结果可能有区别

3、三元运算符

[ condition ] && echo “ok” || echo “nook”

4、条件组合判断

[]

[[]]

&& || -a(and) -o(or)

if [ a = b && b = c ];then echo o k ;else echo nook ;fi

区别:

[] 与 - a -o 一起使用

[[]] 与 && || 一起使用

常用的判断运算符

1、字符的判断:

=
! =
-z 表示判断字符串的长度是否为0,为0 返回true
-n 表示判断字符串的长度是否为空,不空 返回true

2、整数比较

-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
-eq 等于
-ne 不等于

> < =

3、文件比较

-r 有读权限
-w 写权限
-x 执行权限
-f 文件存在并且是常规文件
-s 文件存在并且不为空
-e 判断文件存在
-d 判断是否为目录
-b 判断文件存在并且是一块设备
-L 判断是否一个链接

read命令(交互)

1、 read:人机交互界面,

用来获取手动输入的值
echo “请输入一个值”
read VALUE
echo $VALUE

2、read -p 不换行

read - p (提示语句) ”请输入一个字符“ ”VALUE“

read -p (提示语句) -n (输入的字符个数) -t (等待时间)

循环语句

1、while 循环

while [ expression ]

do

command

done

注意点:中括号的两端需要有kongge

##!/bin/bash
read -p "请输入一个数字:" num
while [ $num -lt 10 ]
do
echo "$num"
let num++
done

2、loop2=3

while ((loop2<=3))

do

echo $loop2

let loop2++

done

注意:shell中也支持break continue

3、case语句

case 值 in

​ 模式1)

​ command

​ command

;;单个模式的结束

​ 模式2)

​ command

​ command

;;

esac

支持continue break

例子
while :
do
read -p “请输入一个1-5之间的数:” num
case n u m i n 1 ∣ 2 ∣ 3 ∣ 4 ∣ 5 ) e c h o " 你 输 入 的 数 num in 1|2|3|4|5) echo "你输入的数 numin12345)echo"num符合要求"
break
;;
*)
echo "你输入的数$num不符合要求,请从新输入 "
continue
esac
done

4、for 循环

第一种

for i in 1 2 3 (循环体,命令产生信息)

do

echo $i

done

第二种

for ((i = 0 ; i<=5 ;i++))

do

echo $i

done

shell自定义函数

1、语法:

[function] 函数名称()

{

​ action;

​ [return int;] 1-255

}

1.注意:函数shell的函数,必须在调用函数之前必须声明,先声明后使用,shell脚本,按顺序执行,逐行调用,而不像java一样先编译再执行

2.函数的返回值。只能通过$?系统变量来获取,可以显示的通过return返回,如果不加return,将以最后一条命令的执行结果作为函数的返回值,turn的数字范围,(0-255)

2、脚本调试:

sh -vx myfuncs.sh

或者 在脚本中加入set -x

借助bashbd

3、函数的参数:

注意:$10不能获取到第10个参数,获取第10个参数 ${10},当n>=10时,需要使用{n}来获取

4、函数的返回值
vi funwithreturn.sh
##!/bin/bash
funwithreturn()
{
echo "请输入第一个参数:"
read anum
echo "请输入第二个参数:"
read bnum
echo "输入的两个数字分别为:$anum 和 $bnam !"
return  $(($anum +$bnum))
}
funwithreturn
echo "输入的两耳数字分别为: "$?    


6、跨脚本调用函数

先将要调用的函数所在的脚本加载到本脚本所在的执行空间,后就可以跟调用本脚本
的变量一样进行调用脚本函数
. shell脚本程序
或者
source shell脚本程序
再调用函数

时间格式化:

date -d " 1 days ago “+”%Y-%m-%d"

定时任务;

crontab -u hadoop -e ;

crontabl -l:列出

crontab -r:删除

自动化脚本案例

1.用expect进行处理人机交互

vi pre.sh

#!/bin/bash/expect
set timeout -1
spawn ssh localhost
expect{
“(yes/no)”{send “yes\r”;exp_continue;}
“password:”{send “123456\r”;exp_continue;}
eof {exit 0;}
}

expect -f ./pre.sh

2.准备jdk安装

mkdir /var/www/html/soft
cp /root/jdk-8u60-linux-x64.tar.gz /var/www/html/soft/

3.脚本开发

vi boot.sh

#!/bin/bash
SERVERS=“hp02 hp03”
PASSWORD=123456
BASE_SERVER=192.168.1.21

你可能感兴趣的:(Linux学习)