Shell----简单整理
------------------------------------------------------------------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编写一个等腰三角形,接收用户输入的数字 ------