目录
一.变量
自定义变量
(1).定义变量
a=1
echo $a
(2).撤销变量
unset 变量
(3).声明静态变量: readonly 变量
注意:不能unset,只能重启
(4).定义全局变量 export 变量名
特殊变量$n
$0代表该脚本名称,$1-$9代表第一道第九个参数,十以上的参数要用大括号包含 如${10}
$# 显示参数的个数
$* $@ 代表命令行中所有的参数
$? 上一条命令是否正确执行,成功是0 非0不成功
二.运算符
1.基本语法
(1). $((运算式)) 或 $[运算式]
(2) expr + , - , \* , |/ , % 加,减,乘,除,取余
expr 运算符之间要有空格
三.条件判断
(1).基本语法
[condition] (condition前后要有空格)
(2).常用判断条件
1.整数之间比较
= 字符串之间比较
-gt 大于 -eq 等于 -lt 小于 -ge 大于等于 -le 小于等于 -ne 不等于
2.根据文件权限判断
-r 有读的权限 -w 有写的权限 -x 有执行的权限
-f 文件 -d 目录 -e 文件存在
四.流程控制
(1).if语句
1.基本语法:
if [ 条件表达式 ];then
程序
elif [ 条件表达式 ]
then
程序
else
程序
fi
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "1111"
elif [ $1 -eq 2 ]
then
echo "222"
else
echo "1234567"
fi
(2). case语句
1.基本语法
case $变量名 in
值1)
如果变量的值为1,则执行程序1
;;
值2)
如果变量的值为2,则执行程序2
;;
*)
如果不满足以上条件执行此程序
;;;
esac
示例:
#!/bin/bash
case $1 in
1)
echo '111'
;;
2)
echo '222'
;;
3)
echo '333'
;;
*)
echo '123321'
esac
(3).for循环
1.基本语法1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
示例
for循环求1-100的值
#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do
sum=$[ $sum + $i ]
done
echo $sum
2.基本语法2
for 变量 in 值1 值2 值3 如果是连续的值,可以用{1..100}表示
do
程序
done
示例
打印所有输入的参数
#!/bin/bash
for i in $*
do
echo $i
done
$* 与 $@ 的区别 不加双引号时没有区别,加了双引号时$*把输入的变量当做了一行,$@还是分开的
#!/bin/bash
for i in "$*"
do
echo $i
done
for j in "$@"
do
echo $j
done
(4).while循环
基本语法
while [ 条件表达式 ]
do
程序
done
示例
用while求出1-100的和
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum
五.read读取控制台输入
1.基本语法
read(选项)(参数)
选项:
-p: 指定读取值时的提示符
-f: 指定读取值是等待的时间(秒).
参数: 变量
示例:
#!/bin/bash
read -t 7 -p "请输入你的姓名:" name
echo $name
六.数组
普通数组
定义方法:
1.一次声明一个值
letter[0]=a
letter[1]=b
letter[2]=c
查看数组的内容
echo ${letter[*]} 或者是 echo ${letter[@]}
2.一次定义多个值,下标默认从0开始,
name=(zhang wang li zhao qiao cui cao)
3.数组其他用法
直接输出的是数组的第一个元素
echo $name
输出数组中下标为3的元素
echo ${name[3]}
输出数组中下标为1到3的元素
echo ${name[*]:1:3}
输出数组中下标大于2的元素
echo ${name[*]:2}
输出数组中下标小于2的元素
echo ${name[*]::2}
定义关联数组
普通数组
定义关联数组之前必须要声明
declare -A 数组名
一次赋一个值
declare -A hero
hero[top]=jianji
hero[mid]=ali
一次赋多个值
hero=([jug]=nanqiang [adc]=vn)
注意:一次赋多个值的话,会把数组之前的数据给替换掉
七.函数
1.系统函数
1).basename
basename [string/pathname] [suffix]
功能描述:basename会删掉所有的前缀,然后显示出来
2).dirname
dirname 文件绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),返回路径名
2.自定义函数
基本语法
funname(){
action
}
funname
函数返回值,只能通过$?系统变量获得
示例:
从键盘接收两个值,求和
#!/bin/bash
function sum(){
read -p '请输入第一个数字' num1
read -p '请输入第二个数字' num2
echo $(($num1+$num2))
echo $[ $num1 + $num2 ]
}
sum
方法2:
#!/bin/bash
function sums(){
sum=0
sum=$(($1+$2))
echo $sum
}
read -p '请输入第一个数字:' num2
read -p '请输入第二个数字:' num1
sums $num1 $num2
八.shell工具
1).cut
1.基本用法
cut [选项参数] filename
2.选项参数
-f 列号 取第几列
-d 分隔符 (且为单个字符)
以空格切割sum.sh的第一列
[root@localhost shells]# cut -d " " -f 1 sum.sh
输出系统变量值,第二个:开始后的所有路径:
[root@localhost shells]# echo $PATH | cut -f 3- -d :
2).sed
流编辑器
返回值都是0不管对错
1.基本语法
sed [选项参数] command filename
2.选项参数说明
-e
3.命令功能描述
a 行尾追加到下一行
d 删除整行
s
3).awk
语法格式
awk 选项 命令 文件名
选项:
-F 分隔符 修改默认分隔符
-v 变量名 自定义变量
命令:
BEGIN{} begin发生在行处理前(注意大写)
{} 行处理时,读一行执行一次
END{} 行处理后
默认以空格切割,cut默认是以单个空格,awk默认是连续的空格
内置变量:
FILENAME 显示文件名 NR:显示读到哪一行 NF:切割后有多少列
FS 输入字段分隔符(默认空格)等同于-F OFS 输出字段分隔符
OFS示例:
[root@localhost ~]# awk -F: '{print $1,$2,$3,$4}' /etc/passwd | head -1
root x 0 0
[root@localhost ~]# awk -F: 'BEGIN{FS=":";OFS="+++"}{print $1,$2,$3,$4}' /etc/passwd | head -1
root+++x+++0+++0
显示一个文件夹中空行的行号
awk '/^$/ {print NR}' /etc/sudoers
示例:打印系统上uid大于等于500且以m开头的行的首字段:
awk -F: '$3>=500 && /^n/ {print}' /etc/passwd
第三个字段有0的打印,和仅为0的,模糊匹配和精确匹配:
awk -F: '$3~0 {print}' /etc/passwd
修改输出分隔符号,特殊字符需转义:
awk -F: 'BEGIN{OFS="~~";}{print $1,$2}' /etc/passwd
4).grep
关键字搜索
grep 参数 文件/路径
-c 输出匹配行的内容
-i 忽视大小写
-r 递归搜索,及查找目录时用
-n 显示行号
-l 只显示文件名不显示内容
-w 匹配整词(精确查找)
练习
显示一个文件下的空行和非空行
grep -c ^$ /etc/nginx/nginx.conf
15
grep -c ^[^$] /etc/nginx/nginx.conf
-w的示例:
5).sort排序
不能指定分割符号
sort(选项)(参数)
选项:
-n 按照数值的大小排序
-r 相反的顺序排序
-t 设置排序所用的分隔符
-k 指定要排序的列
-t 指定分隔符
练习
按照第三位逆序排序
sort -t : -rn -k3 sort1.sh