1、命令解释器
计算机只能识别二进制语言,对于脚本语言需要对应的解释器将语言解释为计算机能识别的二进制语言。
Shell是用户与linux内核之间的解释器,常见的shell解释器/bin/bash、/bin/sh、/bin/csh。可以使用chsh或usermod命令选择默认使用的登录shell。如果想使用其他shell可以直接输入命令,如输入sh,会直接创建一个sh shell,之后输入的命令会使用sh解释器
常用的shell解释器是bash,因为其支持快捷键,Tab补齐,命令历史(history),命令别名(aliase),管道(1)、标准输入和标准输出的重定向。
一行命令想分多行写时使用\,表示换行
2、输出重定向
linux命令输出结果默认是终端窗口,可以使用 > 2> &> >>等命令可以对命令输出进行重定向
1、> 命令
使用如ls > a.txt 将ls命令的正确输出结果重定向到a.txt。但是使用一个>会覆盖a.txt中原来的内容,相当于每次都重新创建一个a.txt然后将结果输出。
2、2> 命令
会将命令的报错结果输入到指定文件中。
3、&> 命令
会将命令的正确结果和错误结果都输入到指定文件中
3、管道
管道可以将多个命令结合使用,将前一个命令的输出结果输入管道,管道中的数据会作为 后一个命令的输入信息。
4、变量
1、定义变量
变量名=变量值
2、取消变量
unset 变量名,一般情况下脚本编写过程中,是不需要unset的,脚本执行完成后会自动回收(?)
3、查看变量(使用变量)
$变量名 或 ${变量名},两者的区别在于:使用括号适合变量进行一些字符串拼接,例如X=Centos,则echo ${X}6.5,则可以输出Centos6.5,如果是echo $X6.5,系统会认为变量名是X6。
5、变量类型
1、环境变量(变量名通常大写,有操作系统维护)
存储在/etc/profile或~/.bash_profile,命令env可以列出所有环境变量
常见环境变量:PATH(命令搜索路径)、PWD(当前工作路径)、USER(当前用户名). RANDOM应该也属于环境变量
2、位置变量(bash内置变量,存储脚本执行时的参数)
$1、$2、…、${10}、${11}…(超过9以后必须使用花括号)
3、预定义变量(bash内置变量,用来保存脚本程序的执行信息,可以调用但是不能赋值或修改)
$0(当前所在的进程或脚本名),$$(当前进程的PID),$?(上一条命令的执行状态,0表示正常,非0表示执行错误),$#(已加载的位置变量的个数),$*(所有位置变量的值),$@(与$*作用相同,区别在与,没有双引号包括时两者都是数组,被双引号包裹时,$*表示一个字符串。)
$!(shell最后运行的后台Process的PID)
4、自定义变量(用户自主设置)
6、$符号的几个用法
1、$()
该符号与反引号等价,都是用做命令替换的,将符号所在处的内容替换为命令的执行结果。在某个地方需要命令执行结果的时候使用。
2、${}
用于变量替换,将符号所在处的内容替换为变量的值。加上{}只是方便明确变量名的界限。
3、$[]
内部可以进行变量运算,且变量不需要使用$表示 ,并且将运算结果进行替换。其效果和$(())等价,但不同的是(())单独使用时,内部可以像C程序一样进行运算,而[]只有和$一起使用时才能进行变量运算并进行替换。
7、多种引号的区别
1、双引号
允许扩展,可在字符串内使用变量。例如:echo “$USER id is $UID”,结果为root id is 0。
2、单引号
禁用扩展,即使是$符号也会被当作普通字符。例如:echo '$USER id is $UID’的结果是 $USER id is $UID。
单引号和双引号的区别仅作为字符串时有效,对于类似sed或者awk命令后面的跟的条件动作等无效。
3、反引号
命令替换,程序会优先执行反引号中的内容,并使用运行结果替换掉反引号出的内容。
$()与反引号等效,test=`grep root/tec/shadow`与 test=$(grep root/tec/shadow)等效。
8、几个常用的命令
1、read
read [-p “提示信息”] 变量名
该命令会将输入的信息赋值给该变量,如果输入的是密码,不想显示在屏幕中可以加 -s。
2、echo命令
格式:echo -e "\033[字背景颜色;文字颜色m 字符串\033[0m"
加-n表示不换行
\033可以替换为\e,表示控制码的开始,m表示控制码的结束,0是表示终止前面的效果
文字 背景
黑色:30 40
红色:31 41
绿色:32 42
黄色:33 43
蓝色:34 44
粉色:35 45
青色:36 46
白色:37 47
灰色:38 48
9、全局变量和局部变量
局部变量:新定义的变量默认只在当前的shell环境中有效,无法在子shell环境中使用
全局变量:全局变量在当前shell及子shell环境中均有效。定义全局变量时使用expor,例如export x=11
10、数组变量
1、数组的定义
数组名=(值1 值2 值3)
2、读取数组
echo ${array[i]}
echo ${array[@]}
i是索引,其中@和*是特殊的索引,表示数组的所有成员,可用于for循环中
3、数组的长度
echo ${#arrary[@]}
echo ${#arrary[*]}
4、提取数组成员
echo ${array[@]:1:3}
返回从数组1号位置开始的3个成员
11、字符串处理与变量初始化
1、字符串或变量长度
phone=18842579666
echo ${#phone}
11
2、字符串截取
echo ${phone:3:3}
425
echo ${phone:1}
8842579666
echo ${phone:2:-3}
842579
第二个:后面表示要截取的数量,如果是-3,则表示从当前位置截至到剩余后三个不截取
3、字串替换
替换一个子串: ${变量/旧字串/新字串}
替换所有子串: ${变量//旧字串/新字串}
phone=134345789
echo ${phone/3/X}
1X4345789
echo ${phone//3/X}
1X4X45789
4、字符串掐头
从左到右,最短匹配删除
${变量#关键词}
从左到右,最长匹配删除
${变量##关键词}
关键词是正则表达式,然后将正则表达式从头开始匹配
A=root:x:0:01
echo ${A#root}
:x:0:01
echo ${A#*:}
x:0:01
echo ${A##*:}
01
*是通配符
5、字符串去尾
从右到左,最短匹配删除
${变量%关键词}
从右到左,最长匹配删除
${变量%%关键词}
6、变量初始化
变量有值,则返回该变量的值
变量无值,则返回关键词
格式: ${变量:-关键词}
ipass=${ipass:-123456}
上例,ipass如果没有初始化,则将其初始化为123456
12、函数
1、语法格式
在shell环境中,将一些需要重复使用的操作,定义为公共的语句块,即可称为函数。
function 函数名{
命令序列
… …
}
函数名(){
命令序列
… …
}
2、函数传递参数
函数调用格式:函数名
函数传参格式:函数名 值1 值2 值3 (传递的值作为函数的"位置参数")
注:和脚本传参相同的是$0表示的也是脚本名。
3、函数后台执行
#!/bin/bash
myping (){
ping -c 3 -W1 $1 &>/dev/null
if [ $? -eq 0];then
echo "$1 is up"
else
echo "$2 is down"
fi
}
for i in {1..254}
do
myping "192.168.4.$i" &
done
wait
使用&符号是将执行的函数放入后台执行,但是通过输出进程号测试,并没有创建新进程
wait是等待当前脚本的所有后台进程结束后退出脚本返回命令行,不然可能会脚本执行完毕返回命令行后,后台的函数还在执行,比较乱。
2、中断与退出执行
continue:结束单次循环,进入下一次循环
break:退出当前循环
exit:退出脚本
个人理解:关于continue和break的使用,在c语言中,我们往往是在循环体中使用if判断条件然后进行处理,在shell中可以直接借助&&,例如[ $i -eq 3 ] && continue