------------------------------------------------------------------Shell脚本----------------------------------------------------------------------------------------
1:shell是一个在操作系统上的软件,linux登录后默认就进入这个软件。
shell是一个命令解释器,能解析用户输入的命令(ls,pwd......)。
shell拥有自己的内建命令集。
2:bash
bash(Bourne Again shell)是shell的扩展,并且完全兼容shell(类似vim与vi的关系)
3:什么是shell script
Shell脚本是利用shell的功能所写的一个小程序,将一些shell的语法与命令写在里面,
搭建管道与数据重定向等功能,以达到我们所想要的功能。
4:解释型语言与编译型语言
Shell脚本是解释型语言,执行的时候是逐条解释你写的程序。(Python)
编译型语言需要先进行编译器编译,将代码翻译成机器能识别的指令,然后运行(C++)
一:创建
1:使用文本编辑器(vim)来创建文本文件(以.sh结尾)
#!---------------------------------第一行必须包括shell的声明
#/bin/bash--------------------------告诉系统执行的时候调用什么解释器
2:输入命令(linux以及shell内建命令)
echo "hello word"
3:给文件添加执行权限。
chmod 755 hello.sh
4:运行脚本。
第一种方式:指定脚本的绝对或相对路径来运行 ./hello.sh
第二中方式:直接运行解释器,将脚本作为参数运行sh hello.sh
5:常见问题
-bash:./hello.sh:Permission denied 没有赋予执行权限
二:shell变量,赋值
1变量:
变量:以字符或下划线开头,后面跟任意长度的字母:var=linux
变量的引用:在变量前面加"$"符号:echo "$var"
**如果变量的中间有空格,需要用双引号引起来:var="hello word"
2特殊变量:
位置参数:$n,n为数字,$0为命令本身,$1-$9是命令第一到九个参数
$*---------------------------------代表所有的参数。
$#---------------------------------代表参数的个数
$?---------------------------------代表命令的返回状态
3命令替换和赋值:
命令替换格式:------------------------------$(cmd) 或者 `cmd`# ``为tab上的反引号。
在执行命令的时候会先将$(cmd)或者`cmd`里的命令先执行一遍,再将结果返回到原来的命令中。
var=$(uname-a)
echo $var
命令替换和管道的去区别?
命令替换:是将一个命令的输出作为另外一个命令的参数。
管道 :将命令的输出作为下一个命令的标准输入。
如:data + %Y|touch
touch $(data + %Y)
4算数运算和赋值:
echo 1+2,没有输出3。(shell需要特殊的格式来进行算数运算)
方式一:((i=$j+$k))
方式二:let i=$j+$keys
赋值:
var = $(($i+$j))
echo $var
5多个命令分隔符:
分号(;)是shell的命令分隔符,让同一行的命令能够顺序执行。:echo1 ;echo2
练习题:
1:命令行输入2个数字,写个小程序,计算2个数字的和,并输出结果
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum
2:命令行输入2个文件,写个小程序,把这两个文件都拷贝到以年月日命名的目录下,并输出每次拷贝的执行结果 date +%Y%m%d
#!/bin/bash
file1=$1
file2=$2
dir=`date +%Y%m%d`
mkdir $dir
cp $file1 $dir && echo "copy ok"
cp $file2 $dir && echo "copy ok
三:shell中的控制结构if:
#!/bin/sh
#make a directory
mkdir /home/dave/mydocs
#copy all doc files
cp *.docs /home/dave/docs
#delete all doc files
re *.docs
上述脚本有什么问题?如果目录创建失败或目录创建成功但文件拷贝失败会如何?
会导致文件没有备份就被删除。因此需要在命令执行前做逻辑判断,
根据上次命令的不同的执行状态,来采取不同的操作。这里大概就会分为两类:条件判断,基于各种条件,进行后续相应操作;循环控制
1:if语句和test命令
(1):字符串测试(两边要有空格)
== 等于
!= 不等于
> 大于
< 小于
-z string 测试指定字符是否为空,空为真,非空为假。
-n string 测试指定字符串是否为空,空为假,非空为真。
(2):文件测试
-e FILE 测试文件是否存在
-f file 测试文件是否为普通文件
-d file 测试指定路径是否为目录
-r file 测试文件对当前用户是否可读
-w file 测试文件对当前用户是否可写
-x file 测试文件对当前用户是否都可执行
(3):组合测试
-a:and
-o:or
!:非
练习:
1:判断当前用户是否是root,不是的话退出,如果是的话显示一下root的登录shell
用户id:id -u
退出: exit
切分文件行:cut ,-d设置分隔符,-f打印某字段
#!/bin/bash
if [ `id -u` -eq 0 ]
then
shell=`grep "^root" /etc/passwd|cut -d : -f 7`
echo $shell
else
exit 1
fi
2:命令行输入任意三个整数,判断最大的数
MAX=$1
if [ $2 -ge $1 ]; then
MAX=$2
fi
if [ $3 -ge $MAX ]; then
MAX=$3
fi
echo "the max number is $MAX."
3:用Shell脚本,判断/bin/nohup是不是可执行文件,如果是将其拷贝到/tmpdir目录下,判断如果/tmpdir目录不存在,自动创建。
if [ -x /bin/nohup ]
then
if [ ! -d /tmpdir ]
then
mkdir /tmpdir
fi
cp /bin/nohup /tmpdir
fi
四:shell中&&和||的使用方法
1:&&运算符:
command1 && command2
&&:左边的命令返回真(0),执行成功后,右边的命令才能被执行。
命令之间使用&&连接,实现逻辑与的功能。
如:test -f /var/log/messages && echo ok
2:||运算符:
command1 || command2
||:则与&&相反,如果||左边未成功执行,那么执行||右边的命令才能被执行。
如:test -f ||echo error
五:for循环语法:
1:for循环
for arg in[list]
do
command.....
done
list列表可以是以空格分割的字符串,也可以是命令替换返回的结果。
如:
for v in /etc/sudoers/etc/resol|v.conf
do ls -l $v
done
练习:
1:请用for创建100个文件,文件名为ps1-ps100
#!/bin/bash
for i in `seq 100`
do
touch ps$i
done
2:请用for把ps1-ps100,分别创建100个tar包,命名ps1.tar-ps100.tar
#!/bin/bash
for i in `ls ps*`
do
tar -cvf $i.tar $i
done
六:while循环语法:
1:while循环:
while [condition]
do
condition
done
输入名字打印一个随机数字
while read -p "please input a name "name;
do
echo $name $RANDOM;
done
七:shell函数:
格式:
function nmae(){
}
shell函数可以带function关键字,也可以不带。
shell函数内可以加return返回值,也可以不带,如果不带就以最后一条命令运行结果,作为返回值。
例如:
demoFun(){
echo *这是我的第一个shell 函数!*
}
echo "------函数开始执行----------------"
demoFun
echo "------函数执行完毕-----------------"
练习:
1:请查找出/etc/下面所有包含name字符串的文件
2:批量创建10个用户,用户名为user1-user10,并设置统一的密码为123456。要求先判断用户是否存在,不存在再创建。
3:将/etc/下所有.conf结尾的文件,拷贝到/newconf目录,将/newconf打包为以当前时间戳定义的文件名。
要求:判断/newconf目录是否存在,如果不存在就自动创建,如果存在,就先清空这个目录
4:请用for创建100个文件,文件名为1.py-100.py,并全部更改文件名为lufei1.py-lufei100.py。
5:写一个编译安装python3的脚本
6:请用shell编写一个等腰三角形,接收用户输入的数字
------