数字IC学习之语言篇:Shell

目标:

  • 了解shell是什么;
  • 了解shell的基本语法;
  • 仿真中几种常用shell脚本;

一、shell的简介

        简单来说就是用户和操作系统间的命令解释器。通过提示您输入,向操作系统解释,然后处理来自操作系统的输出结果。

        shell类型:最常用的是Bash(Bourne Again Shell)

Bourne Shell(/usr/bin/sh或/bin/sh)

Bourne Again Shell(/bin/bash)

C Shell(/usr/bin/csh)

K Shell(/usr/bin/ksh)

Shell for Root(/sbin/sh)  

        查看当前Linux系统的默认解释器:echo $SHELL

二、shell的使用

1.注意事项

        shell编程,首行需要声明脚本由什么shell解释,如#!/bin/bash,否则使用默认shell

        shell命名,最好名称能体现出功能,后缀一般以.sh结尾

        shell脚本,变量不能以数字、特殊符号开头,可以使用_,在等号两边不能直接出现空格

        shell脚本执行方式:(首先chmod  +x  xxx.sh)

./xxx.sh  : 先按照文件中#!指定的解释器解析,若不存在则使用系统默认的   

bash xxx.sh  :指定先用bash解释器,若不存在则使用系统默认的

. xxx.sh :直接使用默认解释器,不会执行第一行指定的#!,但第一行还是要写

2.基本语法

2.1 变量

2.1.1环境变量:

        主要保存的是与系统操作相关的数据。例如$PATH等

设置环境变量:

  • export  变量名=变量值    # 声明变量
  • env    #查询环境变量
  • unset 变量名  #删除变量

2.1.2用户变量:

        在脚本中自定义的变量(主要使用等号将值赋给用户变量时,在变量、等号和值之间不能出现空格)

  • 将命令输出赋值给变量的方法:反引号 ` 和 $() 格式
  • 常见系统变量,用于对参数判断和命令返回值判断时使用:
    • $0  当前脚本名称
    • $n  当前脚本的第n个参数(n= 1、2、...)
    • $* 当前脚本的所有参数(不包括程序本身)
    • $# 当前脚本的参数个数(不包括程序本身)
    • $? 程序最后一次执行的命令的返回状态,返回0表示执行成功
    • $$ 程序本身的PID号
  • 数组变量,给某个变量设置多个值,这些值可以单独使用也可以整体使用2099e3c272304856848998155feae7b4.png
  • 在键盘中获取值
    #!/bin/bash
    echo "请输入num的值"
    read num
    echo "num=$num"
    
    //在一行上显示和添加提示,需要加上-p
    #!/bin/bash
    read -p "请输入num的值:" num
    echo "num=$num" 

2.2 控制语句

2.2.1 if条件语句

常见用法:

#单分支语句

        if(条件表达式);then

                语句1

        fi

#双分支语句

        if(表达式);then

                语句1

        else

                语句2

        fi

#多分支语句

        if(表达式);then

                语句1

        elif(表达式);then

                语句2

        elif(表达式);then

                语句3

        fi

常见逻辑判断运算符:

  • -f     判断文件是否存在,if [ -f  filename ];
  • -d    判断目录是否存在,if [ -d dir ];
  • -eq  等于,应用于整型比较
  • -ne  不等于,应用于整型比较
  • -lt     小于
  • -gt    大于
  • -le     小于或等于
  • -ge    大于或等于
  • -a     双方都成立,逻辑表达式 -a 逻辑表达式
  • -o     单方成立,逻辑表达式 -o 逻辑表达式
  • -z     空字符串
  • -x     是否具有可执行权限
  • ||      单方成立
  • &&    双方都成立

2.2.2 for循环语句

常见用法:

        for  变量名  in 取值列表;

                do

                语句

                done

ps:数组的概念:相同类型的元素按一定顺序排列的集合。

格式:array=(元素1  元素2  元素3  ……)。

数组中元素个数num=${#array[@]} 或者@也可以写成*

遍历数组array中元素的写法:

        for ((i=0 ; i<${#array[*]} ; i++))

                do

                echo ${array[$i]}

                done

或者

        for array in ${array[*]};         

                do

                echo $array

                done

#例如结合ls命令使用 for array in `ls /home/xxx`

2.2.3 while循环语句

常见用法:

        while (表达式)

                do

                语句

                done

注意:break语句于continue语句(break是终止循环、continue是跳出当前循环)

2.2.4 case选择语句

常见用法:

case 模式名 in

模式1)

        命令;;

模式2)

        命令;;

*)

        不符合以上模式执行的命令

esac

2.2.5 select选择语句

常见用法:

        select i in (表达式)

                do

                语句

                done

2.3 函数

        定义函数有两种格式:

  • 函数名(){    命令....   }
  • function 函数名(){   命令....   }

3.基本用法

3.1 历史命令与常用快捷键

3.1.1 历史命令的调用

  • 使用上下箭头调用
  • 使用“!n”重复执行第n条历史命令
  • 使用“!!”重复执行上一条命令

3.1.2 常用快捷键

  • ctrl+a:光标移动到命令行开头
  • ctrl+e:光标移动到命令行结尾
  • ctrl+r:在历史命令中搜索
  • ctrl+c:强制终止当前命令
  • ctrl+u:剪切光标前的内容
  • ctrl+k:剪切光标后的内容
  • ctrl+y:粘贴剪切的内容
  • ctrl+d:退出当前终端
  • ctrl+l:清屏,相当于clear

3.2 输入输出重定向

3.2.1 输出重定向

  • 命令 > 文件  :以覆盖的方式,把命令的正确输出写到指定的文件中
  • 命令 >> 文件 :以追加的方式,把命令的正确输出写到指定的文件中

3.2.2 输入重定向

  • wc [选项]  [文件名]  :选项-c / -w / -l 分别为统计字节数 / 单词数 / 行数 

3.3 多命令执行与管道符

3.3.1 多命令执行

  • 命令1 ; 命令2   :多个命令顺序执行,命令间无逻辑关系
  • 命令1 && 命令2 :逻辑与,当命令1正确执行,命令2才会执行
  • 命令1 || 命令2  :逻辑或,当命令1执行不正确,命令2才会执行;当命令1执行正确,则命令2不会执行

3.3.2 管道符

  • 命令1 | 命令2 :命令1的正确输出作为命令2的操作对象

3.4 特殊符号

  • 单引号:里面的内容仅作为字符串输出,没有特殊含义
  • 双引号:里面的内容存在 调用变量的值$  引用命令`  转义符\  时可以被执行

3.5 echo 命令

        显示命令,显示文本行或变量,或者把字符串输入到文件。语法:echo [选项]  [字符串] 

基本用法:

  • echo -n "想要的内容"       # -n表示输出不换行
  • echo -e "想要的内容"       # -e会对转义字符进行处理,注意单引号和双引号的区别
  • echo "想要的内容" >(或者>>)文件名  #echo的重定向,>表示覆盖 ,>>表示追加
  • echo *txt      #显示指定格式的文件,此处显示txt格式文件       

3.6 grep 命令

        搜索命令,使用指定选项和特定正则表达式可以精准搜索特定内容,常与管道符结合使用。语法:grep [选项] ‘关键词’  [文件]

基本用法:

  • 选项中 -i 不区分大小写、-n 显示匹配行及行号、-v 显示不包含匹配文本的所有行、-c 只输出匹配行的计数、-r 递归搜索子目录(grep --help可查看)
  • grep -i  -A 2  'abc'  file.v   抓取file.v文件中含有关键词abc的行及其后两行

3.7 find命令

        文件查找命令,语法:find [目录]  [选项]  ‘匹配项’

基本用法:

  • 选项中 -name 、-size、-maxdepth
  • find ./ -maxdepth 2 -name 'test*'   查找当前目录两级内名字以test开头的文件

3.8 sed 命令

        根据脚本命令来处理文本文件中的数据。语法:命令行格式:sed [选项] ‘命令’ files

基本用法:

  • sed '2,4d' test.v     #删除2-4行,指定行的范围用逗号隔开
  • sed '/aaa/,/bbb/d' test.v  #删除aaa所在行到bbb所在行
  • sed 's/old/new/g'  test.v   #将test.v中old替换成new
  • sed '/100/a  hello ' test.v  #在100所在行后追加一行hello
  • sed '/100/i  hello'  test.v  #在100所在行前追加一行hello
  • sed '/old/c new' test.v  #将test.v中old修改成new
  • sed -e '1,3d' -e 's/old/new/g' test.v   #多重编辑,类似管道符

3.9 awk命令

        过滤命令,语法:awk [选项] '匹配模式{在找到匹配内容时执行的命令}'  filename

基本用法:

  • 选项 -F ---指定输入文件分隔符 、-v---赋值一个用户定义变量
  • awk内置变量:NR是指正在处理的记录位于文件中的行数,NF指正在处理的记录的域个数(与域分隔符有关),FILENAME是指文件名
  • /^d/,用来过滤目录,/^-/,用来过滤文件,/^l/,用来过滤链接;例如ls -l  | awk '/^d/ { print $NF }' 打印当前目录下的子目录、ls -l  | awk '/^-/ { print $NF }' 打印当前目录下的文件(ls -l查看文件类型代码:[d]--目录,[-]--文件,[l]--链接 ,awk中/ /里的按照正则表达式理解,^表示字符串中开始的位置)

4.仿真常用shell脚本

4.1 本地仿真环境更新

#!/bin/bash

#################################################
# testenv  update                               #
# 将本地仿真环境下的内容更新为公共仿真环境下的内容 #
#################################################
function testenv_update
{
    local=`pwd`
    read -p "please input SIM_RTL path:" SIM_RTL
    filelist=(`ls -l $SIM_RTL | awk '/^-/{print$NF}'`)
    num=${#filelist[@]}
    for ((i=0 ; i<$num; i++))
        do
          cp -rf $SIM_RTL/${filelist[$i]} $local/${filelist[$i]}
        done
    echo "testenv update finish!"

}

testenv_update

4.2 本地文件夹批量清理指定内容

#!/bin/bash

###########################################################
#testenv_clr                                              #
#批量删除当前目录下含“标识文件,如Boot.dat”文件夹内的指定内容#
###########################################################

function testenv_clr
{
    clrfiles="*.shm  *.log"    #此处指定需要删除什么内容
    local=`pwd`
    read -p "please input keyword:" name
    filepath=(`find ./ -name $name`)
    num=${#filepath[@]}
    echo "Delete files path:"
    for ((i=0; i<$num; i++))
        do
            path=$(dirname $filepath[$i])
            cd $path        
            pwd
            rm -rf $clrfiles
            cd $local
        done
    echo "Delete files finish!"
}

testenv_clr

4.3 批量运行仿真

#!/bin/bash

###########################################################
#runlist  all test                                        #
#自动依次运行所有仿真环境                                   #
###########################################################

function runlist
{
    clrfiles="*.shm  *.log"    #此处指定需要删除什么内容
    run_name="make sim"      #此处指定运行仿真的命令
    echo "***********runlist start***************"
    local=`pwd`
    array=(`find ./ -name $1`)   #筛选出含$1的文件夹
    num=${#array[@]}
    for ((i=0; i<$num; i++))
        do
            path=$(dirname $array[$i])
            cd $path        
            pwd
            rm -rf $clrfiles
            $run_name
            cd $local
        done
    echo "***********runlist end***************"
}

runlist makefile 

参考资料:

linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]_linux怎么使用shell脚本_宝山的博客的博客-CSDN博客

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值