目标:
- 了解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号
- 数组变量,给某个变量设置多个值,这些值可以单独使用也可以整体使用
- 在键盘中获取值
#!/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博客