shell是什么
shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动,挂起,停止甚至是编写一些程序.
脚本格式要求
1.脚本以#!/bin/bash
开头
2.脚本需要有可执行权限(即x)
脚本的执行方式
方式1:首先要赋予脚本x
权限,再执行脚本
如:有一个helloworld.sh脚本
chmod 744 helloworld.sh
给所有用户一个x权限
./helloworld.sh
(相对路径)或/root/shell/helloworld.sh
(绝对路径)执行脚本
方式2:sh 脚本
,此时不用赋予脚本x权限,直接执行即可
如:sh ./helloworld.sh
(相对路径)
#编写helloworld.sh脚本
#!/bin/bash
echo "helloworld"
[root@localhost myshell]# sh helloworld.sh
helloworld
[root@localhost myshell]# sh /root/myshell/helloworld.sh
helloworld
[root@localhost myshell]# chmod 744 helloworld.sh
[root@localhost myshell]# ./helloworld.sh
helloworld
[root@localhost myshell]# /root/myshell/helloworld.sh
helloworld
shell的变量
Linux Shell中的变量分为:系统变量
和用户自定义变量
系统变量:$HOME
,$PWD
,$SHELL
,$USER
等,比如:echo $HOME
显示当前shell中的所有变量:set
1.定义变量:变量=值
2.撤销变量:unset 变量
3.声明静态变量:readonly 变量
注意:静态变量不能unset
定义变量的规则:
1.变量名称可以由字母,数字和_
组成,但是不能以数字开头
2.等号两边不能有空格
3.变量名称一般习惯为大写
将命令的返回值赋给变量:
A=`ls -a`反引号,运行里面的命令,并把结果返回个变量A
A=$(ls -a)等价于反引号
设置环境变量
1.export 变量名=变量值
,将shell变量输出为环境变量
2.source 配置文件
(/etc/profile),让修改后的配置信息立即生效
3.echo $变量名
,查询环境变量的值
注释
#单行注释
:<<!多行注释!
位置参数变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量.比如:./helloworld.sh 200
,这个就是执行shell的命令行,可以在helloworld脚本中获取到参数信息
$n | n为数字,$0代表命令本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 ‘ 9代表第一到第九个参数,十以上的参数需要用大括号包含,如` 9代表第一到第九个参数,十以上的参数需要用大括号包含,如‘{10} ` |
---|---|
$* | 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,$@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
预定义变量
预定义变量:就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
$$ | 当前进程的进程号(PID) |
---|---|
$! | 后台运行的最后一个进程的进程号(PID) |
$? | 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确执行.如果这个变量的值为非0 ,则证明上一个命令执行不正确 |
运算符
1.$((运算式))
或$[运算式]
2.expr m + n
,注意:expr运算符间要有空格
expr \*
,/,% 乘
,除,取余
如要计算(2+3)*4:
方式1:result=$(((2+3)*4))
方式2:result=$[(2+3)*4]
方式3:temp=`expr 2 + 3`
result=`expr $temp * 4`
条件判断
[ 条件 ]
注意条件
前后要有空格
#非空返回true
如:
[ 条件 ] 返回true(非空)
[ ] 返回false
[ 条件 ] && echo DK || echo notok 条件满足,执行后面的语句
常用判断条件:
两个整数的比较 | |
---|---|
-lt | 小于 |
-le | 小于等于 |
-eq | 等于 |
-gt | 大于 |
-ge | 大于等于 |
-ne | 不等于 |
= | 字符串比较 |
按照文件权限进行判断 | |
-r | 有读的权限 |
-w | 有写的权限 |
-x | 有执行的权限 |
按照文件类型进行判断 | |
-f | 文件存在并且是一个常规的文件 |
-e | 文件存在 |
-d | 文件存在并且是一个目录 |
if elif
if [ 条件判断式 ];then
程序
fi
或者:
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
then
程序
fi
注意:[ 条件判断式 ],中括号和条件判断式之间必须有空格
case语句
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
...省略其它分支
*)如果变量的值都不是以上的值,则执行此程序
;;
esac
for循环
基本语法1:
for 变量 in 值1 值2 值3 …
do
程序
done
基本语法2:
for((初始值;循环控制条件;变量变化))
do
程序
done
while循环
while [ 条件判断式 ]
do
程序
done
read
read读取控制台输入
基本语法:read(选项)(参数)
选项 | |
---|---|
-p | 指定读取值时的提示符 |
-t | 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了 |
参数 | |
变量 | 指定读取值的变量名 |
函数
shell编程和其它编程语言一样,有系统函数,也可以自定义函数.
1.系统函数:
basename
返回完整路径最后/
的部分,常用于获取文件名
basename [pathname] [suffix]
,suffix为后缀,如果suffix被指定了,basename会将pathname中的suffix去掉
dirname
返回完整路径最后/
的前面的部分,常用于返回路径部分
dirname 文件绝对路径
,从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分).
2.自定义函数:
基本语法:
[ function ] funname[()]
{
Action;
[return int;]
}
#中括号中的可不写
调用直接写函数名:funname [值]
面试题
#请用shell脚本写出查找当前文件夹(/home)下所有的文本文件内容包含有字符"shen"的文件名称
[root@localhost myshell]#grep -r "shen" /home | cut -d ":" -f 1
#有文件chengji.txt内容如下:
张三 40
李四 50
王五 60
使用Linux命令计算第二列的和并输出
[root@localhost myshell]#cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}'
#shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?
#!/bin/bash
if [ -f file.txt ]
then
echo "文件存在"
else
echo "文件不存在"
fi