目录
脚本格式
脚本以#!bin/bash开头
输出
echo ""
执行
使用"sh/bash 文件名"可以直接执行,直接使用文件名需要运行权限才可以执行
多条命令处理实例
#!/bin/bash
cd /home/atguigu/
touch banzhang.txt
echo "I love cls" >> banzhang.txt
变量
变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
等号两边不能有空格
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
变量的值如果有空格,需要使用双引号或单引号括起来
常用系统变量
$HOME $PWD $SHELL $USER
声明变量
A=1
echo $A
撤销变量
unset A
声明静态(只读)变量
readonly B=3
静态变量不可unset,在系统重启后消失
将变量提升为全局变量
export B
特殊变量$n
$0为脚本名称,$1,$2,$3...为脚本第1,第2,第3个参数,超过10需要用${10}
#!/bin/bash
echo "$0 $1 $2 $3"
直接运行
bash parameter.sh
#输出:
parameter.sh
输入一个参数
bash parameter.sh banzhang
#输出:
parameter.sh banzhang
输入三个参数
bash parameter.sh banzhang love mm
#输出:
parameter.sh banzhang love mm
输入的参数多于三个时并不会报错,与输入三个时一致
特殊变量$#
#!/bin/bash
echo $#
bash parameter.sh banzhang love mm
#输出:
3
脚本名不算参数
特殊变量$*、$@
$*:代表命令行中所有的参数,把所有的参数看成一个整体
$@:代表命令行中所有的参数,把每个参数区分对待
#!/bin/bash
echo $#
echo $*
echo $@
bash parameter.sh banzhang love mm
#输出:
3
banzhang love mm
banzhang love mm
特殊变量$?
功能:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,有命令自己来决定),则证明上一个命令执行不正确。
parameter.sh
#敲回车后这条指令正确执行
echo $?
#输出
0
运算符
基本语法
-
“$((运算式))”或"$[运算式]"
-
expr +,-,\*,/,% 加,减,乘,除,取余 注意:expr运算符间要有空格
实例
expr 3 + 2
#输出
5
expr `expr 2 + 3` \* 4
#输出
20
s=$[(2+3)*4]
echo $s
#输出
20
条件判断
基本语法
[ condition ]
注意:condition前后要有空格,条件非空即为true。[ atguigu ]返回true,[]返回false
常用判断条件
=字符串比较
数之间的比较:
-lt小于 -le小于等于
-gt大于 -ge大于等于
-eq等于 -ne不等于
按照文件权限进行判断:
-r有读的权限 -w有写的权限
-x有执行的权限
按照文件类型进行判断:
-f文件存在并且是一个常规的文件
-e文件存在 -d是否是一个目录
实例
[ 23 -ge 22 ]
echo $?
#输出
0
#输出0代表正确执行,即为true;非0代表没有正确执行,即为false
[ -w helloworld.sh ]
echo $?
#输出
0
[ -e /home/atguigu/banzhang.txt ]
echo $?
#输出
0
多条件判断
&&表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败后,才执行下一条命令
[ condition ] && echo OK || echo notok
#condition为true时执行echo ok,为false时执行echo notok
流程控制
if判断
基本语法
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
注意:[ 条件判断式 ]中括号和条件判断式之间必须有空格,if后面也要有空格
实例
#!/bin/bash
if [ $1 -eq 1 ];then
echo "banzhang zhen shuai"
elif[ $1 -eq 2 ];then
echo "cls zhen mei"
fi
bash if.sh 1
#输出
banzhang zhen shuai
bash if.sh 2
#输出
cls zhen mei
case语句
基本语法
case $变量名 in
"值1")
程序
;;
"值2")
程序
;;
*)
如果变量值都不是以上的值,则执行此程序
;;
esac
注意:case行尾必须为一个单词“in”,每个模式匹配必须以右括号“)”结束
实例
#!/bin/bash
case $1 in
1)
echo "banzhang"
;;
2)
echo "cls"
;;
*)
echo "renyao"
;;
esac
base case.sh 2
#输出
cls
for循环
基本语法1
for(( 初始值;循环控制条件;变量变化 ))
do
程序
done
实例
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
bash for.sh
#输出
5050
基本语法2
for 变量 in 值1 值2 值3...
do
程序
done
实例
#!/bin/bash
for i in "$*"
do
echo "banzhang xihuan $1"
done
bash for2.sh mm cls xiaoze
#输出
banzhang xihuan mm cls boduo
#!/bin/bash
for i in $@
do
echo "banzhang xihuan $1"
done
bash for2.sh mm cls xiaoze
#输出
banzhang xihuan mm
banzhang xihuan cls
banzhang xihuan boduo
当$*和$@都不加双引号""括起来时,都表示分开的所有参数
当都用双引号""括起来时$*会将所有参数合成一个整体作为的变量,$@仍然表示分开的所有参数
while循环
基本语法
while [ 条件判断式 ]
do
程序
done
实例
#!/bin/bash
i=1
s=0
while [ $i -le 100 ]
do
s=$[$s + $i]
i=$[$i + 1]
done
echo $s
bash while.sh
#输出
5050
read读取控制台输入
基本语法
read(选项)(参数)
选项:
-p:指定读值时的提示符
-t:指定读值时等待的时间(秒)
参数
变量:指定读取值的变量名
#!/bin/bash
read -t 7 -p "input your name " NAME
echo $NAME
bash read.sh
#显示
input your name
#输入
banzhang
#输出
banzhang
函数
系统函数
basename基本语法:
basename [string / pathname] [suffix]
作用:返回文件名
实例
basename /home/atguigu/banzhang.txt
#输出
banzhang.txt
basename /home/atguigu/banzhang.txt .txt
#输出
banzhang
dirname基本语法:
dirname 文件绝对路径
作用:返回文件绝对路径(去除文件名部分)
dirname /home/atguigu/banzhang.txt
#输出
/home/atguigu
自定义函数
[ function ] funname[()]
{
Action
[return int]
}
funname
注意:
必须在调用函数地方之前,先声明函数,shell脚本是逐行运行,不会想其他语言一样先编译
函数返回值只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值n(0-255)
function sum()
{
s=0
s=$[$1+$2]
echo $s
}
read -p "input your parameter1:" P1
read -p "inout your parameter2": P2
sum $P1 $P2
bash sum.sh
#显示
input your parameter1:1
input your parameter2:2
#输出
cut
在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符字段输出
基本用法
cut [选项参数] filename
实例
cut -d " " -f 1 cut.txt
以空格切割,取第一列
cut -d " " -f 2,3 cut.txt
以空格切割,取第二、三列
x cat cut.txt | grep guan
查看cut.txt,并过滤出含有“guan”的行
cat cut.txt | grep guan | cut -d " " -f 1
查看cut.txt,并过滤出含有“guan”的行,然后对过滤结果进行切割
sed
对文件进行编辑处理并输出,但原文件内容不会改变
基本用法
sed [选项参数] 'command' filename
实例
sed "2a mei nv" sed.txt
在第二行插入“mei nv”,并打印出来,注意,sed.txt文件并没有被更改
sed "/wo/d" sed.txt
删除包含“wo”的行
sed "s/wo/ni/g" sed.txt
将所有wo替换成ni
sed -e "2d" -e "s/wo/ni/g" sed.txt
将第二行删除,并将wo替换成ni
awk
作用与cut类似
基本用法
awk [选项参数] 'pattern1{action1} pattern2{action2}...' filename
选项参数:
-F 指定输入文件的分隔符
-v 赋值一个用户定义变量
实例
awk -F : '/^root/ {print $7}' passwd
passwd文件以“:”分隔,选取以root开头的行,显示第7列
awk -F : '/^root/ {print $1","$7}' passwd
显示第1列和第7列,中间以“,”分隔
awk -F : 'BEGIN{print "user,shell"} {print &1","$7} END{print "dahaige,bin/zuishuai"}' passwd
打印文件的第1列和第7列,中间用“,”分隔,并在全文的开头插入“user,shell”,在末尾插入“dahaige,bin/zuishuai”
awk -F : -v i=1 '{print $3+i}' passwd
将文件的第3列所有数值加1并打印
awk -F : '{print FILENAME","NR","NF}' passwd
打印文件的文件名、已读的记录数、浏览记录的域的个数(切割后,列的个数)
sort
将文件进行排序并输出
基本语法
sort(选项)(参数)
实例
sort -t : -nrk 2 sort.sh
以“:”分隔,对第2列按数值大小进行倒叙排序
-t:设置分隔符
-n:按照数值大小排序
-r:逆序
-k:指定要排序的列