写在前面:只接触过一点点shell,这次修改脚本都是一点点百度,下面记录下自己梳理的内容。
SHELL 是用C语言编写的程序,又叫命令行的解释器。它将输入的命令加以解释后传给系统,为用户和内核之间的交互提供了一个接口。原理:当用户下达指令给操作系统的时候,实际上是把命令告诉shell,经过shell解释、处理后让内核做出相应的动作。而系统的回应和输出的信息也由shell处理,然后显示在用户的屏幕上。
bash的特点:使用键盘上下键可以切换输入的历史命令;使用tab键可以自动补全命令;使用命令--help或者man可以查看命令的帮助信息。
一 输入与输出
1)输入输出
标准输入 stdin 代码 0
标准输出 stdout 代码 1
标准错误输出 stderr 代码 2
2)输出重定向
重定向符号: > 覆盖重定向 >> 追加重定向 < 输入重定向
cat f1 1> f2 //将cat命令的标准输出重定向到f2文件中
cat /etc 2> f3 //将cat命令的标准错误输出重定向到f3文件中
cat f1 &> f4 或 cat f1 > f4 2>&1 //将cat命令的输出,包括标准输出和标准错误输出,重定向到f4文件中
例:常用于忽略命令的输出
ping 127.0.0.1 &> /dev/null 或 ping 127.0.0.1 > /dev/null 2>&1 //输出结果不会显示,且需要Ctrl+C退出
二 环境变量
1 环境变量控制文件
1)/etc/profile 设置用户工作环境,
/etc/bashrc 设置系统功能、函数、别名。
这两个是系统环境变量配置文件。
2)~/.bash_profile 用户登录时执行该文件,设置用户的使用环境;
~/.bashrc 用户登录或打开新的SHELL时执行该文件;
~/.bash_logout 用户退出SHELL时执行该文件。以上文件均为个人环境变量配置文件。
注:当系统文件与个人配置文件发生冲突时以个人配置文件为主
2 重要的环境变量
系统内存在着一些变量,通过给这些变量赋值可以控制用户的工作环境,这就叫环境变量。以下是环境变量及其说明:
LOGNAME 登陆名,也就是账户名 PATH 命令搜索路径
PS1 命令提示符 PWD 用户的当前目录
SHELL 用户的shell类型 TERM 终端类型
HOME 用户主目录的位置,通常是/home/用户名
1)查看所有的环境变量: set //包括系统和个人的环境变量
查看各选项的功能是否开启: set -o //开启set -o vi 关闭set +o vi(了解)
查看系统环境变量: env //environment
2)设置环境变量
临时设置:export 环境变量名=值 //例 export a=1
永久设置:vim /etc/profile ,在文件末尾添加 export 环境变量名=值,保存退出后source /etc/profile
例:#vim /etc/profile 在文件末尾添加 export LANG=en_US,UTF-8
然后 source /etc/profile //将系统语言改成了英文
3)查看某环境变量的 值: echo $环境变量名
4) PS1 控制当前SHELL的命令提示符显示的内容
查看PS1: echo $PS1 修改PS1: PS1=新的值
例如:PS1=“{\u@.@\h \w}\\$” 再改回来 PS1=”{\u@\h \W}\\$”
5)PATH 当前系统命令所在路径
查看PATH: echo $PATH 修改PATH: PATH=新的值
例如:PATH=$PATH:/root //在PATH中添加路径root
注1:Linux中,PATH环境变量中各个目录间使用冒号“:”隔开。Windows中,开始——右键我的电脑——属性——高级——环境变量——系统变量——path,Windows中PATH环境变量中各个目录间使用分号“;”隔开
注2:编写一个1.sh文件脚本,把该脚本放在PATH某个目录的路径下就可以直接输入命令 #1.sh直接运行该脚本。或者把1.sh所在的目录添加到PATH下,向上面的例子一样,这样直接输入#1.sh也能运行脚本
6)子shell
开启子SHELL: bash 关闭子SHELL: exit
三 正则表达式
1 常用表达
\n 换行符 \t 制表符
$ 匹配字符串的结尾位置 ^ 匹配字符串的开始位置
.匹配除换行符以外的所有单字符
()表示一个子表达式的开始和结束位置 *匹配前面的子表达式0次或多次
+ 匹配前面的子表达式1次或多次 ?匹配前面的字表达式0次或1次
2 举例说明
dg+ 可匹配dg以及dgg、dgggg等 dg? 匹配dg、dga、dgb等
dg* 可匹配dg及dga,dgaaa等 dg{2} 匹配dgg,不能匹配dg
dg{2,} 能匹配dgg,dggg,dgggg等 d{2,4}能匹配dd,ddd,dddd
echo {Sunday,Monday}.log //显示包含Sunday,Monday}.log的字串
echo file{1..5}.txt //显示以file开头,第5个字符由1至5,且后缀为.txt的字串
echo file{a,b}{1,2}.txt //显示以file开头,5,6个字符为a1,a2,b1,b2且后缀为.txt的字串
echo file{a{1,2},b,c}.txt //显示以file开头,第5,6个字符为a1,a2及第5个字符为b,c且后缀为.txt的字串
四 历史命令
1)查看历史命令:history
history记录历史命令的条数由环境变量HISTSIZE决定,默认是1000条
!n ——执行历史的第N条指令,n为history中的第N条指令
!! ——执行最后一次执行的命令 !str——执行最后以str开头的命令
2)Ctrl+r——匹配输入过的命令,在命令行模式下输入Ctrl+r即可
3)快速移动光标——字符操作快捷键
将光标移动到当前命令行的头部Ctrl+a 将光标移动到当前命令的尾部Ctrl+e
清除光标前至头部的字符Ctrl+u 清除光标前至尾部的字符Ctrl+k
五 命令分隔符
“;”分号,命令依次执行 //优先级最低
“&&”前面命令执行成功后,后面命令才执行 //&&与||同级,从左到右依次执行
“||”前面命令执行失败后,后面命令才执行
注意:不用记所有的优先级,直接用括号括起想要先执行的命令
六 shell脚本
1 基本使用
1)SHELL脚本:使用SHELL语言编辑的文件,一般以.sh为文件的后缀,用于批量执行命令。
2)变量的赋值
变量:用于存储特定的数值 赋值格式:变量名=值
3)释棒/释伴 #!/bin/bash:用于规定当前脚本使用的SHELL
4)SHELL脚本的输入与输出
输入: read 变量 //从键盘输入一个值赋给变量,例如 read a
输出: echo 变量 //$用于提取变量中存储的值,echo用于将当前变量的值输出到屏幕,例,echo $a
2 脚本的执行
方法一:为脚本增加执行权限,以绝对路径的方式执行,例chmod a+x 1.sh 然后/root/1.sh
方法二:使用bash命令执行,但需要文件属主具有读权限,例如,bash 1.sh
例如:vim age.sh
#!/bin/bash
echo “please input your age:”
read age
echo “your age is $age!”
然后输入 bash age.sh即可
3 $的使用
$$ 指当前进程ID号
$? 表示上一条命令的执行结果,0则为上一条命令执行成功,1则为失败。经常用其作为if、while等语句的判断条件,
如while [ $? -ne 0 ] ,-ne为不等于。
$1,$2 表示传入/调用的第一个参数,第二个参数
$VALUE 调用参数
4 函数的定义与调用
#获取网卡上ipv6地址的cidr
#定义函数getcidr
getcidr(){
local dev=$1
local cidr=`ip addr show $dev|grep inet6|head -n 1|awk '{print $2}'|cut -d '/' -f 2`
local addr=`ip addr show $dev|grep inet6|head -n 1|awk '{print $2}'|cut -d '/' -f 1`
echo $addr/$cidr
}
#调用函数,$1指的就是$dev,即调用该函数时传入的第一个参数
getcidr $dev
5 利用其他脚本生成函数缓存,并调用缓存函数
vim bak.sh
getcidr(){
local dev=$1
local cidr=`ip addr show $dev|grep inet6|head -n 1|awk '{print $2}'|cut -d '/' -f 2`
local addr=`ip addr show $dev|grep inet6|head -n 1|awk '{print $2}'|cut -d '/' -f 1`
echo $addr/$cidr
}
vim use.sh
source /root/bak.sh
ip6cidr=$(getcidr)
6 if的使用
6.1 格式
格式1: if [条件] then 语句1 else 语句2 fi //一个条件
格式2: if [条件1] then 语句1 elif [条件2] then 语句2
elif [条件3] then 语句3 ……… else 语句n fi //多个条件
6.2 判断条件
1)数字判断
-eq 等于 -ne不等于 -ge 大于等于 -gt 大于 -le 小于等于 -lt 小于
2)字符串判断
= 字符串相等 !=字符串不相等 -z 字符串 字符串长度伪为真 -n字符串 字符串长度不伪为真
3)文档判断
-e 文件名 如果文件存在则为真 -d 目录名 如果目录存在则为真
-x 文件名 如果文件存在且可执行则为真 -b 文件名 如果文档存在且为块设备
-c 文件名 如果文档存在且为字符设备则为真
6.3 举例说明
1)if [ $2 ] //$2是否为0,为0则执行then,否则执行else
Then
time=$2
else
time=30
fi
2)if [ ! -e $FILE ] //$FILE是否不存在,不存在则执行then
then
echo 0
return
fi
3)if [ "$str" == "1" ] //$str是否是1,是则删除$FILE
then
rm $FILE
fi
}
4)if [ $num -eq 1 ] //$num是否等于1,等于则删除$FILE
then
rm $FILE
fi
}
5) if [ -n $addr ] //如果$addr存在,则执行then语句
then
ip addr show|grep $addr
else
echo "$addr doesn't exsit !!!"
fi
7 Case多路判断语句
7.1 格式:
case 变量名 in
条件1)语句1 ;;
条件2)语句2;;
条件3)语句3;;
………
*)语句n;;
esac
7.2 举例说明
#!/bin/bash
echo “please input your number:”
read number
case $number in
18)echo “hi,lucky sweetie!”;;
28)echo “hi,go away!”;;
38)echo “hi, nice try!”;;
*)echo “please input the right number!”;;
esac
8 for 语句
8.1 格式:
for 变量 in 值1 值2 值3 ……
do
语句
done
注:break 跳出循环,即终止循环 continue 跳过本轮循环
8.2 举例
#!/bin/bash #!/bin/bash
for i in 1 2 3 for i in 1 2 3
do do
if [ &i –eq 2 ] if [ &i –eq 2 ]
then then
break continue
else else
echo $i echo $i
fi fi
done done
结果: 1 1 3
9 while
格式:
while [ 条件 ]
do
语句
done
例1:vim while.sh 例2:vim xunjian.sh
#!/bin/bash while true
a=1 do
while [ $a -le 3 ] ps aux|sed 1d|sort -rn -k3|head -n5
do sleep 2s //系统延迟2秒,取消延迟用Ctrl+c
echo $a done
let a=$a+1 //这样就会每隔2秒输出结果
done //结果:1 2 3
10 循环语句 until
until [ 条件 ]
do
语句
done //直到条件为真才停止执行
例如:vim until.sh
#!/bin/bash
a=1
until [ $a -eq 3 ]
do
echo $a
let a=$a+1
done //运行结果: 1 2 3
11 select
格式:
select 变量 in 值1 值2……
do
语句
done
例如:vim select.sh
select i in 1 2
do
case $i in
1)echo “your choice is 1”;;
2)echo “your choice is 2”;;
*)break;;
esac
done
七 脚本的调试
1)脚本执行失败会显示执行到具体哪一行失败,修改该行代码。执行失败的那行后面的行一般都是未执行,从而不知道后面有没有错误。
2)bash -x 脚本名 ,可以查看脚本执行到每一行时具体的状态
3)也可以在脚本内容中添加set -x
转载请注明出处,谢谢!