一、是什么
可以简单的理解为人机语言交互的翻译官
二、怎么用
1、查看当前操作系统支持的解析器
cat /etc/shells
2、查看当前操作系统默认的解析器
echo $SHELL或者env |grep SHELL
一般为/bin/bash,特别的/bin/sh实际也是软链接到/bin/bash
3、Shell格式
脚本文件以.sh或无后缀结尾
脚本内容以#!/bin/bash或#!/bin/sh开头
4、脚本的执行
1)bash xxx.sh或sh xxx.sh或./xxx.sh(./xxx.sh本质是当前用户自己执行脚本,故需要有执行权限)
2)source xxx.sh或. xxx.sh
说明:方式1会启一个子shell进程来执行脚本,方式2则会使用当前bash进程来执行脚本,区别在于方式1存在环境变量不共用或同步的场景,而方式2可以避免此类问题
5、查看系统预定义变量
set或env
两者区别在于set涉及的范围大,而env则小些
6、自定义变量
格式:key=value 注:=两边不能加空格,默认value是字符串类型,key或value中有空格时需要使用''或""括起来
使用:echo $key
撤销变量:unset key
定义一个只读变量:readonly key=value 注:该变量无法撤销,系统重启销毁
将变量提升为全局变量:export key 注:在子shell中修改全局变量,不影响父shell
扩展:将当前目录设置为可执行脚本目录,需要将目录添加到$PATH中
echo "export PATH=$PATH:/指定目录" >> /etc/profile
source /etc/profile
7、特殊变量
1)$n 注:n位数字,0代表脚本名称,1-9代表脚本参数位,超过10,使用${10}表示,示例:./test.sh adc de,$0值位test.sh,$1值为abc,$2值为de
2)$# 注:表示脚本参数的个数,常用于内部循环判断
3)$* 注:表示把所有参数看为一个整体
4)$@ 注:表示把所有参数看为一个集合,与3)的区别在于使用"$*"时表示一个整体,"$@"表示一个集合,而不使用""时,两个均是集合
5)$? 注:返回上一条命令的执行结果,0表示正常或成立,非0表示异常或不成立
8、运算符
语法:$((运算式))或$[运算式] 注:此处使用运算符可以使用数学运算符
或expr {+,-,\*,/,%} 注:expr的运算符之间必须有空格,示例:expr 1 + 2,嵌套运算expr `expr 1 + 2` \* 3
9、条件判断
语法:[ condition ] 注:condition前后需有空格,如condition非比较,则有值为true
值比较:=或!=用于字符串比较,如下比较符用于数值比较,示例:[ 1 -eq 2 ]
-eq | 等于 | -ne | 不等于 |
-lt | 小于 | -le | 小于等于 |
-gt | 大于 | -ge | 大于等于 |
权限比较:-r 有读权限,-w 有写权限,-x有操作权限
文件类型比较:-e 文件存在,-f 是文件,-d 是目录
三元运算符:[ condition ] && value1 || value2
10、流程控制
1)if
单分支:
if [ condition ]
then
程序
fi
多分支:
if [ condition ]
then
程序
elif [ condition ]
then
程序
else
程序
fi
说明:if后必须有空格,多个condition条件可用&&拼接多个[]或使用-a连接多个条件,同理也可使用||或-o,特别的,为避免获取参数为null,可使用"$1"x = "abc"x
2)case
case $变量 in
"value1")
程序1
;;
"value2")
程序2
;;
*)
程序3
;;
esac
说明:等同于java中的switch-case,;;同break语句,*)同default语句
3)for
for((i=0;i<=100;i++))
do
程序
done
或
for 变量 in value1 value2...
do
程序
done
或
for 变量 in {value1 value2...}
do
程序
done
说明:{}表示一个序列,{1..100}表示从1到100,in类型的循环表示将后面的值逐个赋给前面的变量
4)while
while[ condition ]
do
程序
done
注:像sum=$[ $sum + $a ]的运算可通过let关键字来使用编程类语言,使用示例let sum+=a
11、读取控制台输入
格式:read option 变量
示例:read -t 7 -p "Enter your name:" NAME
echo $NAME
说明:-t表示等待时间,无-t参数则一直等待;-p表示指定提示符
12、函数
1)系统函数
①basename
格式:basename {string/path} [suffix]
示例:basename /usr/local/abc.sh 输出结果为abc.sh
basename /usr/local/abc.sh .sh 输出结果为abc
说明:basename会获取最后一个/之后的字符,无suffix参数时直接输出,有suffix时则去掉字符的suffix后缀再输出
②dirname
格式:dirname 文件全路径
示例:dirname /usr/local/abc.sh 输出结果为/usr/local
2)自定义函数
[function] functionname[()]
{
程序
[return i;]
}
说明:[]内的内容选择性可写,return也可以使用$?来获取结果,i的取值范围是0~255
示例:
function add()
{
s=$[$1+$2]
echo $s
}
read -p "请输入第一个参数:" a
read -p "请输入第二个参数:" b
sum=$(add $a $b)
三、Shell工具
1、cut剪切数据
格式:cut [option] filename
参数:-f指需要提取的列号,-d指指定的分隔符,默认为制表符"\t",-c指按字符切割
示例:cat /etc/passwd |grep bash$ |cut -d ":" -f 1,6,7
说明:-f 3-表示按指定分隔符切割后第3列之后所有的列
2、sed动作编辑
格式:sed [option] command filename
参数:-e指直接在指令列模式上进行编辑
command:a表示新增,a后跟字符串则增加到下一行,d表示删除,s表示查找并替换
说明:sed命令不会修改源文件内容,只是修改打印在控制行的数据
示例:
1)在某文件指定行的下一行追加内容
sed "na 内容" filename
说明:n指定行号
2)删除指定内容
sed "/内容/d" filename
3)替换指定内容
sed "s/old/new/g" filename
说明:g表示全局替换
4)删除并替换
sed -e "nd" -e "s/old/new/g" filename
3、awk切片
格式:awk [option] '/part1/{action1} /part2/{action2}' filename
说明:part指awk在数据中查找的内容,action指匹配成功后的操作
参数:-F指定分隔符,默认空格,-v指赋值一个用户定义变量
示例:cat /etc/passwd |awk -F ":" '/^root/{print $1","$6","$7}'
给输出结果添加头尾: awk -F ":" 'BEGIN{print "Hello"}{print $1","$7}END{print "World"}' /etc/passwd
4、sort排序
语法:sort option filename
参数:-n表示按照数值大小排序,-r表示逆序排列,-t用来设置排序时所用的分隔符,-k表示需要排序的列