概述
shell的作用
翻译,把用户输入的指令转换成二进制,传递给内核执行,内核执行完成之后,再通过shell翻译成人类能够看懂的语言
linux系统中的shell的种类:
bash:linux默认的shell
tcsh:整合了csh的功能,提供比csh更强大的功能;
nologin:禁止用户登录
cat /etc/shells:系统自带的shell
除非指定,默认都是bash
cat /etc/passwd:最后一个字段,表示系统登录时用户使用的shell
shell脚本:
什么是脚本:
扩建语言,动态语言,也是一种编程语言
控制软件应用程序,脚本都是以文本形式保存。只在调用时才会进行解释或者编译
shell脚本的构成:
第一类:开头,注明解释器,#!/bin/bash (默认系统自带的,不加也会默认启动)#!/usr/bin/python
第二类:执行语句,都是系统支持的命令格式。只要系统能够执行的语句(包含第三方的扩展命令),都可以作为执行语句
第三类:注释语句#作为注释,注释的代码不会被执行
脚本执行的方式:
工作中都是使用赋权执行,sh和source只限于调试阶段
1.不需要赋予执行权限就可以执行
sh
source:点命令,也是一个符号,是bash的内部命令,自带的。作用:读取文件当中的可执行命令,然后会加载到shell中,不用重启直接生效
2.赋权执行:执行权限
chmod :赋权命令
./first.sh:相对路径执行,当前目录
/opt/first.sh:绝对路径执行
重定向与管道
重定向的操作:
重定向输出:>,把指定结果保存到文件中,会覆盖原有的内容
重定向输出:>>,会在当前的内容的尾部追加,不覆盖原有的内容
重定向输入:<,从指定文件中读取数据,也可以理解为免交互(需要关闭安全机制,否则会出错)
重定向错误输出:2>,将错误信息保存到指定文件,会覆盖原有的内容
重定向错误输出:2>>,将错误信息保存到指定文件,不覆盖原有的内容
混合输出:&>,标准和错误都保存到文件当中,会覆盖原有的内容
管道符:|
管道符的作用:把管道符前面的命令结果,作为管道符后面命令的参数,也就是操作对象
管道符主要是对文本内容的处理,命令的结果也是一个文本内容
cat /etc/passwd | grep "root"
shell变量的作用、类型
变量:可以改变,有类型和范围的值
变量需要有范围和类型,用户指定变量(自定义变量)
自定义变量:用户指定需要的参数
变量的作用:
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
变量的类型:
int:整数
string:字符串
布尔:true ;false
浮点:小数
变量名:固定名称,用户自定义,系统预设
1.不要使用linux系统的操作指令,或者系统命令来指定变量名
2.不要使用中文指定变量名
3.不要使用特殊字符号开头,¥#&*,可以用_开头
4.默认原则:最好使用名称的英文来指定变量名
5.注释,目的:1.解释一下代码用途。2.万一你离职了,后面的人好交接。
自定义变量:
指定变量名:
变量名是区分大小写的
aa=test1
AA=test2
查看变量名:echo
最好加上{}避免发生歧义
echo ${aa}
echo ${AA}
删除变量:unset
unset aa
unset AA
赋值的时候引号的作用:
`` :反撇号,命令替换,把命令执行的结果赋值给变量
' ' :单引号,强引用,用单引号打印变量,只会输出变量名,不会输出变量的值,只会打印变量的名称
" " :双引号,弱引用,打印变量的赋值
通过read命令来获取变量:
-p(一定要加" "否则会出错):指定提示符,提示用户输入数据
格式:read -p " " a(变量名)
只读变量:readonly
1.只读变量不能重新赋值
2.只读变量不能删除
全局变量:在程序和脚本中以及全部的shell环境中都可以被引用
默认情况下,新定义的变量只能在当前的shell中生效,也可以叫局部变量
export:声明全局变量,也可以查看;临时声明,只对当前的shell中,重启失效
永久声明的文件:
/etc/profile:对所有人
/root/.bash_profile:只能对root用户生效
环境变量:
系统提前创建好的,或者人工添加的,用来设置用户的工作环境,配置系统行为,传递信息,控制程序执行
系统环境变量:所有人都可见,都可用
echo $PATH:可执行程序的默认路径
用户级环境变量:只能对当前用户开放和使用
echo $HOME:看所有用户级
echo $USER:表示用户名称
echo $PWD:表示当前所在目录
echo $PATH:可执行程序的默认路径
位置变量:
命令行参数
脚本运行时,从外部传递变量值,让脚本来运行,可以根据需要来进行处理
$n:n表示的是数字:1、2、3、4、5、6、7、8、9、${10},10以上的参数要用花括号来表示。
sh weizhi.sh 10 20 :传参
$0:表示命令本身,然后从左往右依次赋值。要在脚本执行时,在外部传入变量值
$1=10
$2=20
创建11个变量,分别给他们传参:
预定义变量:
编程语言或者脚本解释器提供的,可以自动设置,但是由编程语言和脚本解释器自动完成,人工不能修改
$* $@:表示命令和脚本需要处理的参数
$*:加引号时,会把参数当成一个整体处理;不加引号,会把参数分别处理
$@:加不加引号,都会把参数分开处理
$* $@在不加引号时,都会把参数分开处理
$#:统计传递给脚本参数的个数
$?:表示一条命令或者脚本执行后的返回码;返回码是0表示执行正确,所有非0的返回码都表示执行错误
注意:$?只能返回上一次,最近一次命令或者脚本执行的返回码
利用上面创建的11个变量做一个整数运算和一个if语句:
更加直观的表面了$#和$*的作用
$#就表示传参的个数,这边传了11个数,所以$#的结果就为11
$?就表示返回码,因为if语句不满足条件,启动else所以返回码为1,直观的表现了语句是否执行失败。
数值运算:
整数运算:
方法一:i=$(($a+$b))
+加法-减法*乘法/除法%取余
方法二:expr
i=$(expr $a \ * $b)乘法要加\
方法三:let
let i=$a*$b
i++ i=$(($i+1)):先赋值,再加i=1 i=1+1 i=2+1 每次自加1
i--:每次自减1 先赋值再减
i+=2:每次自加2 先赋值,再加2
++i:先加再赋值,自加1
--i:先减再赋值,自减1
非整数运算:
bash 不支持浮点运算,如果需要进行浮点运算,需要借助bc,awk 处理。
#!/bin/bash
#加
f=$(echo "4.3+2.5"|bc)
echo "4.3+2.5=$f"
#减
f=$(echo "4.3-2.5"|bc)
echo "4.3-2.5=$f"
#乘
f=$(echo "4.302.50"|bc)
echo "4.32.5=$f"
#除
f=$(echo "scale=2;4.3/2.5"|bc)
echo "4.3/2.5=$f"
#混合运算
f=$(echo "2.2/(2.2-1.1)2+1.1"|bc)
echo "2.2/(2.2-1.1)2+1.1=$f"
#加
f=$(awk 'BEGIN{print 4.5+3.4 }')
echo "4.5+3.4=$f"
#减
f=$(awk 'BEGIN{print 4.5-3.4 }')
echo "4.5-3.4=$f"
#乘
f=$(awk 'BEGIN{print 4.53.4 }')
echo "4.53.4=$f"
#除
f=$(awk 'BEGIN{print 4.5/3.4 }')
echo "4.5/3.4=$f"
#混合
f=$(awk 'BEGIN{print (4.5-3.4)2+3 }')
echo "(4.5-3.4)2+3=$f"