Shell编程基础
Shell脚本规范
Shell基础用法
Shell变量
Shell数组
Shell函数
shell是一个命令解释器,是介于操作系统内核与用户之间一个绝缘层。准确地说,它也是一种强力的计算机语言。shell程序被称为一个脚本,是一种很容易使用的工具,它可以通过将公共程序、工具和编译过的二进制程序粘合在一起来建立应用。
Shell脚本规范
1.创建脚本名称以 .sh 结尾
2.脚本文件首行开头必须写上 #!/bin/bash
3.必须赋予脚本执行权限
[root@linux ~]# chmod +x file.sh
查看Linux系统中的shell
[root@linux ~]# cat /etc/shells
4.Shell脚本执行
./file.sh #.表示当前位置执行shell
/root/file.sh #绝对路径执行shell
bash file.sh #bash执行shell
source file.sh #source执行shell
脚本调试(语法错误)
[root@linux ~]# bash -n file.sh
脚本调试(检查错误)
[root@linux ~]# bash -x file.sh
Shell基础用法
单引号'' 完全引用,不能调用变量
双引号"" 部分引用,可调用变量
反引号`` 执行命令,`free -m | awk '/Mem/{printf("%d\n"),$3/$2*100}'`
# -n不换行
[root@linux ~]# echo -n $UID
0[root@linux ~]#
# -e开启反斜杠转义,\n换行
[root@linux ~]# echo -e "aaa\nbbb\n"
aaa
bbb
# \t制表符(TAB键)
[root@linux ~]# echo -e "aaa\tbbb\t"
aaa bbb
# \r回车键
||逻辑或 前边命令失败执行后边命令
&&逻辑与 前边命令成功运行后边命令
& 一个&是开后台,例如:cat &
整数运算
• 使用$
• echo $((3+5))
• echo $[3+5]
• echo $((((5+3*2)-4)/2))
除时,如果结果有小数,则截取小数部分
• $算式运算符:+、-、*、/、()
read 命令交互
[root@linux ~]# read a
123
[root@linux ~]# echo $a
123
[root@linux ~]# read -p "IQ passwd:" pass
IQ passwd:123
[root@linux ~]# echo $pass
123
passwd命令在输入密码的时候是不显示的。
[root@linux ~]# vim pass.sh
#!/bin/bash
stty -echo # 在终端上输入的字符不会显示在屏幕上
read -t 10 -p "IQ passwd:" pass # -t 超时时间 10s, -p 在读取之前打印一些提示
stty echo
echo # 换行
echo $pass | mail -s "haha" root@localhost
[root@zyg ~]# ./pass.sh
IQ passwd:
Shell 显示带颜色字体
\033[字背景颜色;字体颜色m ANSI控制码 \33[0m 关闭所有属性
字颜色:30—–37 字背景颜色范围:40—–47
echo -e "\033[30m 黑色字 \033[0m" echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[31m 红色字 \033[0m" echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m" echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m" echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m" echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m" echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m" echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[37m 白色字 \033[0m" echo -e "\033[47;30m 白底黑字 \033[0m"
报警声音
echo -e "\007 the bell ring"
字符串替换
[root@linux ~]# z=123123123
[root@linux ~]# echo ${z/1/}
23123123
[root@linux ~]# echo ${z//1/}
232323
[root@linux ~]# echo ${z/1/x}
x23123123
[root@linux ~]# echo ${z//1/x}
x23x23x23
掌握参数传递机制Xargs (空格是默认定界符)
可将多行信息以你想要排列显示出来
例如 cat a.txt | xargs -n 3 每一行以三列显示出来
echo “namexnamexname” | xargs -dx 定义x 为分隔点并不显示x
结果就会 name name name
Shell变量
自定义变量
语法: A=123
调用变量 echo $A
取消变量 unset A
显示所有变量 set
环境变量
在配置文件中给应用程序使用需要继承的时候,使用exprot导出,不能称之为全局,程序创建子进程复制父进程的叫全局。
语法: export A=123
bash 进入子进程,echo $A 就会显示123
env 查看所有环境变量
预定义变量
echo '$0' = $0 #表示当前的进程名
echo '$*' = $* #表示所有位置参数的内容
echo '$#' = $# #表示位置参数的数量
echo '$$' = $$ #表示当前进程的进程号
echo '$!' = $! #表示后台运行的最后一个进程号
echo '$?' = $? #表示命令执行后返回的状态
[root@linux ~]# ./z.sh z y g
$0 = ./z.sh
$* = z y g
$# = 3
$$ = 5470
$! =
$? = 0
位置变量
[root@linux ~]# ./z.sh 1 2 3 4
$0 = ./z.sh
$* = 1 2 3 4 5 6
$# = 6
$1 = 1
$2 = 2
$3 = 3
Shell数组
定义数组
myarry=(1 2 3 4 5)
[root@linux ~]# echo ${myarry[2]}
显示结果为3
查看数组中所有的元素
[root@linux ~]# echo ${myarry[*]}
1 2 3 4 5
统计数组中元素的个数
[root@linux ~]# echo ${#myarry[@]}
5
删除数组:
[root@linux ~]# myarry=(1 2 3 4 5)
[root@linux ~]# unset myarry
删除数组[1]:
[root@linux ~]# myarry=(1 2 3 4 5)
[root@linux ~]# unset myarry[1]
替换:
[root@linux ~]# a=(1 2 3 4 5)
[root@linux ~]# a=(${a[@]/3/100})
[root@linux ~]# echo ${a[@]}
1 2 100 4 5
关联数组
存取时,以非序数(数字),这里是字符串
[root@linux ~]# myarry["two"]=2
[root@linux ~]# echo ${myarry[two]}
2
遍历数组
遍历(For循环法):
[root@linux ~]# for var in ${myarry[@]} ; do echo $var ;done
1
2
3
Shell函数
语法:
function f_name()
{
command
}
示例一:将两个参数求和
function test()
{
n=$[$1+$2]
echo $n
}
test 1 2
[root@linux ~]# sh fun2.sh
3
示例二:输出指定网卡的IP地址
function ip()
{
ifconfig |grep -A1 "$1:" |tail -1 |awk '{print $2}'
}
read -p "Please input the eth name: " e
eth=`ip $e`
echo "$e address is $eth"
[root@linux ~]# sh fun3.sh
Please input the eth name: ens33
ens33 address is 192.168.233.206