shell是一个由C语言编写的,shell即是一种语言也是一种命令,是用户
和Linux沟通的桥梁,shell脚本(shell script)是一种为shell编写
的脚本语言,可以理解为一个可执行的Linux命令集合
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
1、bash hell.sh
2、sh hell.sh
3、chmod a+x hell.sh 然后:./hello.sh
系统变量可以用set查看
列:
[root@localhost ~]# i=1
[root@localhost ~]# echo $i
1
规则:大写字母
[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(定义常量不可改变不可撤销)
1、export a; 可以把变量提升为当前shell进程中的全局变量,可供其他子shell进程调用
2、提升子进程的执行空间
. /root/scripte.sh
or
source /root/script.sh (把脚本加载导执行空间)
soure和. 的区别:
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显示树形进程
1、反引号赋值:A=DATE
反引号里面是命令
2、A =$(ls -al)
$? :表示上一个命令的返回状态(0是执行的正确) :echo $?
$$:表示当前的进程编号
$0:表示当前脚本名称
$n:表示第n 个参数(n从0开始依次加一)
$#:表示参数的个数:常用于循环
@ : @: @:*:参数列表:不确定参数的个数,可以直接使用这两个命令
$@ $* 参数列表,不确定参数个数,可直接使用这两个命令
区别
这两个命令都表示传递给函数的参数列表,不被双引号包含是
都是以$1 $2 3. 。 。 。 。 3.。。。。 3.。。。。n 的形式输出所有的参数
当他们被双引号包含时
“$*“会将所有参数作为一个整体,以”$1, 2... 2... 2...n“的 形式输出
”$@“会将各个参数分开,以”$1”," 2 " , . . . " 2",..." 2",..."n"的形式输
格式:expr m+n 或者 $((m+n)).
注意:expr运算符中间必须有空格
例如 (2 + 3) * 4的值
分布
S=expr 2 + 3
S=expr $S \* 4
合并
S=expr \
expr 2 + 2 ` * 4`
s=$(((2+2)*4))
s=$[(1=2)*4]
i=1
let i++
let i = i +2
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 元年
[condition]
注意:condition 前后必须有空格
if后紧跟then,else后没有
非空返回true,可以使用$?判断
内部的=前后要有空格,否则,结果可能有区别
[ condition ] && echo “ok” || echo “nook”
[]
[[]]
&& || -a(and) -o(or)
if [ a = b && b = c ];then echo o k ;else echo nook ;fi
区别:
[] 与 - a -o 一起使用
[[]] 与 && || 一起使用
=
! =
-z 表示判断字符串的长度是否为0,为0 返回true
-n 表示判断字符串的长度是否为空,不空 返回true
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
-eq 等于
-ne 不等于
> < =
-r 有读权限
-w 写权限
-x 执行权限
-f 文件存在并且是常规文件
-s 文件存在并且不为空
-e 判断文件存在
-d 判断是否为目录
-b 判断文件存在并且是一块设备
-L 判断是否一个链接
用来获取手动输入的值
echo “请输入一个值”
read VALUE
echo $VALUE
read - p (提示语句) ”请输入一个字符“ ”VALUE“
read -p (提示语句) -n (输入的字符个数) -t (等待时间)
while [ expression ]
do
command
done
注意点:中括号的两端需要有kongge
##!/bin/bash
read -p "请输入一个数字:" num
while [ $num -lt 10 ]
do
echo "$num"
let num++
done
while ((loop2<=3))
do
echo $loop2
let loop2++
done
注意:shell中也支持break continue
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 "你输入的数 numin1∣2∣3∣4∣5)echo"你输入的数num符合要求"
break
;;
*)
echo "你输入的数$num不符合要求,请从新输入 "
continue
esac
done
第一种
for i in 1 2 3 (循环体,命令产生信息)
do
echo $i
done
第二种
for ((i = 0 ; i<=5 ;i++))
do
echo $i
done
[function] 函数名称()
{
action;
[return int;] 1-255
}
1.注意:函数shell的函数,必须在调用函数之前必须声明,先声明后使用,shell脚本,按顺序执行,逐行调用,而不像java一样先编译再执行
2.函数的返回值。只能通过$?系统变量来获取,可以显示的通过return返回,如果不加return,将以最后一条命令的执行结果作为函数的返回值,turn的数字范围,(0-255)
sh -vx myfuncs.sh
或者 在脚本中加入set -x
借助bashbd
注意:$10不能获取到第10个参数,获取第10个参数 ${10},当n>=10时,需要使用{n}来获取
vi funwithreturn.sh
##!/bin/bash
funwithreturn()
{
echo "请输入第一个参数:"
read anum
echo "请输入第二个参数:"
read bnum
echo "输入的两个数字分别为:$anum 和 $bnam !"
return $(($anum +$bnum))
}
funwithreturn
echo "输入的两耳数字分别为: "$?
先将要调用的函数所在的脚本加载到本脚本所在的执行空间,后就可以跟调用本脚本
的变量一样进行调用脚本函数
. shell脚本程序
或者
source shell脚本程序
再调用函数
时间格式化:
date -d " 1 days ago “+”%Y-%m-%d"
定时任务;
crontab -u hadoop -e ;
crontabl -l:列出
crontab -r:删除
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
mkdir /var/www/html/soft
cp /root/jdk-8u60-linux-x64.tar.gz /var/www/html/soft/
vi boot.sh
#!/bin/bash
SERVERS=“hp02 hp03”
PASSWORD=123456
BASE_SERVER=192.168.1.21