shell脚本
shell概述
Shell是一个命令行解释器,它是接受应用程序/用户命令,然后调用操作系统内核,功能强大的变成于员,易编写,易调试,灵活性强。
shell解析器
可以通过命令 cat /etc/shells 可以查看系统离的shell解析器有哪些
脚本格式
脚本以 #!/bin/bash开头 (指定解析器)
-
helloworld.sh
脚本
#!bin/bash echo "helloworld"
可通过 sh 文件名执行脚本,亦或 bash 文件名执行,再或者当前根目录 ./文件名 执行,若不借助于sh,bash 首先需要给该脚本执行权限.
./helloworld.sh //会提示permission denied chmod +x helloworld.sh //赋予执行权限即可执行
-
shell 多命令处理
#!/bin/bash cd /home/geekgl touch hehe.txt echo "文件已创建"
-
shell变量
变量规则:变量名称可以由字母,数字,下划线组成,但是不能以数字开头,在linux中大多建议大写变量名
系统变量: H O M E , HOME, HOME,PWD, S H E L L , SHELL, SHELL,USER,这些是系统的全局变量在写多命令处理脚本时可以不用写太多具体的路径,可借助此类变量让脚本更简洁。
自定义变量:变量名=值,需要注意的是,等号两边不能有空格,取值时 $变量名就可以访问
NAME=geekgl echo $NAME //即可输出变量
另外可以用关键字 unset让之前的变量失效
unset NAME echo $NAME //这时会发现已经没有输出那个名字
readonly变量:只读变量,不能unset,声明完不可变,也不能再次赋值其他的值。
-
变量无法直接运算
在bash中,变量默认都是字符串类型,无法直接进行数值运算,如以下
A=5+5 echo $A //输出:5+5,会把变量=后边的值全作为字符串
鉴于以上说的变量赋值时=两边不能由空格,若需要带空格的值,可以以双引号亦或单引号括起来表示,如下
# D= haha //=两边不能由空格,可以用下面的方式 D=" haha"
运算符
-
基本语法
(1)“$((运算式))”或“¥[运算式]”
(2)e’x’pr +,-,*,/,%,加,减,乘,除,取余。expr运算符间要有空格
expr 5 + 5 10 expr 5+5 //不带空格当字符串处理无法运算,运算符+左右两侧得有空格 5+5 expr `expr 5 + 5` \* 4 //(5+5)*4 50 num=$[(5+5)*4] //效果跟上面语句一样,(5+5)*4 50
判断条件
-
基本语法
[ condition ] (注意 condition前后要有空格)
-
常用判断条件
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than)
-le 小于等于(less equal)
-eq 等于(equal)
-gt 大于(greater than)
-ge 大于等于(greater equal)
-ne 不等于(not equal)
(2)文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行权限(execute)
(3)文件类型判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并且是一个目录
流程控制
-
基本语法
if [ 条件判断 ];then
逻辑
fi
亦或
if[ 条件判断 ]
then
逻辑
fi
需要注意的是:
(1)[ 条件判断 ],中括号和条件判断式之间必须有空格
(2) if后要有空格
a=10 b=20 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi
-
case语句
-
基本语法
case $变量名 in
“值 1”)
如果变量的值等于1,则执行程序1…
;; //语句结束双分号,相当于break;
“值 2”)
如果变量的值等于2,则执行程序2…
;; //语句结束双分号,相当于break;
*)
如果变量的值都不是以上的值,则执行此程序(相当于default)
;;
如果变量的值等于1,则执行程序2…
;; //语句结束双分号
esac //case这个语法的倒着写喽
-
#!/bin/bash case $1 in 1) echo "first code...." ;; 2) echo "seccond code...." *) echo "default code...."
可以在命令行输入 $1就可以获取值(此为shell特殊变量,$0代表脚本的全名$1- 101 − 10 个 参 数 , 若 超 过 10 个 参 数 则 可 写 成 10 1-10个参数,若超过10个参数则可写成 101−10个参数,若超过10个参数则可写成{11}…
for循环
for(( 初始值;循环控制条件;变量变化 ))
do
程序…
done
#!/bin/bash
#1-100
s=0 //求和sum
for(( i=1;i<=100;i++))
do
s=$[$s+Si] //若用expr +两边必须有空格
done
echo $s
while循环
while [ 条件判断式 ]
do
程序…
done
#!/bin/bash
#1-100
s=0
i=1
while [ $i -le 100]
do
s=$[$s+si]
i=$[$i+1]
done
echo $s
read读控制台输入
read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时的等待时间(秒)
参数:
变量:指定读取值的变量名
#!/bin/bash
read -t 5 -p "input your password in 5 seconds" PASSWD
echo $PASSWD
函数
系统函数
basename[string/pathname] [suffix] //basename命令会删除掉所有选项前缀包括路径中最后的‘’/”字符,然后将具体的文件名以字符串的形式显示给页面
basename home/geekgl/123.txt
123.txt
dirname 文件绝对路径 //该函数是与以上函数刚好相反,它会获取那个具体文件所在的文件路径但不包括文件名哦
dirname /home/geekgl/123.txt
/home/geekgl
自定义函数
[ function ] funcname[()]
{
Action
[return int;]
}
#!/bin/bash
function sum()
{
s=0;
s=$[$1+$2]
echo $s
}
read -p "input first num" p1
read -p "input first num" p2
sum $p1 $p2
注意:shell脚本不像其他语言会先预编译,所以使用某个函数前必须声明函数
cut命令
cut就是在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节,字符,字段并把这些字节,字符和字段输出。
基本用法
cut[选项参数] filename
说明:默认分割时制表符
参数说明
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列
my she
name is
is very
geekgl beatiful
//123.txt 取出第一列,以空格分割
cut -d " " -f 1 123.txt
my
name
is
geekgl
有多种巧妙的运用,详细的可以具体看cut命令相关资料