Shell常用语法汇总
最近工作需要了解下shell编程一些知识,因此记录一下常用的shell语法。
shell是什么?
简单解释为,计算机内核与应用接口之间的中间层。如下图。
linux相关知识
linux 相关知识可以参考我以前的笔记 入门篇链接.
shell常用语法
1:sh 2:bash 3:./ 4:source 5: . //执行脚本的几种方式 (只有source是在当前bash下执行脚本,其余都是新开一个bash)
/bin/bash -c 'cat /etc/shells' //传递一条命令,给bash解析器。
set //查看所有的变量
A=5 //定义一个变量A (等号两边无空格)
unset A //删除变量
readonly B=2 //声明静态的变量B=2,不能unset
export 变量名 //把变量提升为全局变量
D=I love banzhang //变量的值如果有空格,需要使用双引号或单引号括起来
B="hello $A" //使用双引号可以识别变量
D=`ls -l` //使用反引号,将命令运行的结果赋值给参数
E=$(ls -l) //将命令运行的结果赋值给参数
/****************************************特殊变量***************************************************/
$n //n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$# //获取所有输入参数个数,常用于循环
$* //这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ //这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$? //上一条执行命令的返回值
/************************************** 整数运算符*************************************************************/
num=$((1+1)) //计算1+1
num=$[1+1] //计算1+1 方式二
expr // + , - , \*, /, % 加,减,乘,除,取余
expr `expr 2 + 3` \* 4 //expr方式计算(2+3)*4
/************************************** 条件判断*************************************************************/
[ condition ] //条件非空即为true(注意condition前后要有空格)
-lt //小于(less than)
-le //小于等于(less equal)
-eq //等于(equal)
-gt //大于(greater than)
-ge //大于等于(greater equal)
-ne //不等于(Not equal)
以下按照文件权限进行判断
-r //有读的权限(read)
-w //有写的权限(write)
-x //有执行的权限(execute)
以下按照文件类型进行判断
-f //文件存在并且是一个常规的文件(file)
-e //文件存在(existence)
-d //文件存在并是一个目录(directory)
-s //文件存在且不为空
-L //文件存在且是一个链接(link)
/************************************** 流程控制*************************************************************/
以下为if案例
if [ $1 -eq 1 ]
then
echo "你输入的是1啊!"
elif [ $1 -eq 2 ]
then
echo "你输入的是2啊!"
elif [ $1 -eq 3 ]
then
echo "你输入的是3啊!"
else echo "你输入的不是1,2,3啊!"
fi //反写结束 if语句
以下为case案例
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;; //相当于break
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*) //相当于default
如果变量的值都不是以上的值,则执行此程序
;;
esac //case 反写结尾,结束
以下为for循环案例
sum=0
for((i=1;i<=100;i++))
do
sum=$[$i+$sum]
done
以下为增强for循环案例
for 变量 in {1..3}; do 程序; done //增强for循环
以下为while示例
s=0
i=1
while [ $i -le 100 ] //while 不支持((i=1;i<=100;i++)) 此类操作
do
s=$[$s+$i]
i=$[$i+1]
done
/************************************** 函数篇*************************************************************/
以下为系统函数
read(选项)(参数) //read读取控制台输入 【选项】:-p:指定读取值时的提示符;-t:指定读取值时等待的时间(秒)。【参数】变量:指定读取值的变量名
basename /home/atguigu/banzhang.txt //输出banzhang.txt
dirname /home/atguigu/banzhang.txt //输出home/atguigu
以下为自定义函数
function sum() //function 关键字可以省略
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
sum //调用函数
/************************************** Shell工具*************************************************************/
wc [选项参数] filename //命令用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据
-l //统计文件行数
-w //统计文件的单词数
-m //统计文件的字符数
-c //统计文件的字节数
cut [选项参数] filename //cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出
-f //f为fileds,列号,提取第几列
-d //d为Descriptor分隔符,按照指定分隔符分割列
sed [选项参数] ‘命令’ filename //sed是一种流编辑器,sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕
选项参数
-e //直接在指令列模式上进行sed的动作编辑
命令
a //新增,a的后面可以接字串,在下一行出现
d //删除
s //查找并替换
awk [选项参数] ‘pattern1{action1} pattern2{action2}...’ filename //把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项参数
-F //指定输入文件折分隔符
-v //赋值一个用户定义变量
内置变量
FILENAME //文件名
NR //已读的记录数(行号)
NF //浏览记录的域的个数(切割后列的个数)
例子:
awk -F: '/^root/{print $1","$7}' passwd //搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割
awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd //只显示/etc/passwd的第一列和第七列,以逗号分割。且在开头结尾添加相应文字。
awk -v i=1 -F: '{print $3+i}' passwd //将passwd文件中的用户id增加数值1并输出
awk -F: '{print "filename:" FILENAME ", linenumber:" NR ",columns:" NF}' passwd //统计passwd文件名,每行的行号,每行的列数