shell脚本编写常用语法

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文件名,每行的行号,每行的列数

猜你喜欢

转载自blog.csdn.net/chuang777/article/details/115111136
今日推荐