数字IC脚本常见命令(Shell)
目录
- 1.关于路径
- 2.echo命令——输出文本
- 3.$的用法
- 3.1 变量引用
- 3.2 特殊参数
- 3.3 命令替换
- 3.4 算术运算
- 3.5 变量拓展
- 3.6 数组操作
- 3.7 进程信息
- 4.cp命令——文件复制
- 5.条件判断(if——fi)
- 5.1 if-then语句
- 5.2 if-then-else语句
- 5.3 if-then-elif-else语句
- 6.mkdir命令——目录创建
- 7. grep命令——文本搜索
- 8. sed命令——流编辑器
- 9. rm命令——移除
- 9.1 rmdir命令
- 9.2 rm命令
1.关于路径
/../是 路径表示法,用于访问当前目录的父目录(上一级目录)
-
. 表示当前目录 -
.. 表示父目录(上一级目录) -
/是路径分隔符
示例1:
# 假设当前目录是:/home/user/project/scripts
CDIR=`pwd` # 或 CDIR=$(pwd)
# 结果:CDIR=/home/user/project/scripts
# 基于上面的 CDIR
$CDIR/../lib/std_cell.v
= /home/user/project/scripts/../lib/std_cell.v
# 解析过程:
# 1. 从 /home/user/project/scripts 开始
# 2. /../ 回到上一级:/home/user/project
# 3. 然后进入 lib 目录:/home/user/project/lib
# 4. 最后是文件:std_cell.v
示例2:
# 相对路径示例
../data.txt # 上一级目录的data.txt
../../config.conf # 上两级目录的config.conf
./run.sh # 当前目录的run.sh
subdir/file.txt # 当前目录下子目录的文件
# 绝对路径示例
/home/user/file.txt
/usr/local/bin
2.echo命令——输出文本
-
基本用法:
echo “Hello World”
echo “参数是: $1” -
常用选项:
echo -n “不换行” # 不输出末尾换行符
echo -e “转义字符 换行” # 解释转义字符
3.$的用法
3.1 变量引用
# 引用普通变量
name="John"
echo $name # 输出: John
# 双引号的作用:保留字符串原意,防止空格引起的问题
var="hello world"
echo $var # 输出: hello world (但被当作两个参数)
echo "$var" # 输出: hello world (作为一个整体)
# 引用环境变量
echo $HOME # 家目录路径
echo $PATH # 可执行文件搜索路径
echo $USER # 当前用户名
3.2 特殊参数
echo $0 # 脚本/命令名称
echo $1 $2 $3 # 位置参数(脚本参数)
echo $# # 参数个数
echo $* # 所有参数(作为一个整体)
echo $@ # 所有参数(作为多个独立参数)
echo $? # 上一个命令的退出状态(0=成功,非0=失败)
echo $$ # 当前进程的PID
echo $! # 最后一个后台进程的PID
echo $_ # 上一个命令的最后一个参数
3.3 命令替换
# 将命令输出赋值给变量
current_time=$(date) # 推荐写法
current_time=`date` # 传统写法
echo "现在时间是: $current_time"
# 在字符串中嵌入命令
echo "当前目录: $(pwd)"
3.4 算术运算
a=5
b=3
echo $((a + b)) # 输出: 8
echo $((a * b)) # 输出: 15
echo $((a ** 2)) # 输出: 25(幂运算)
# 简洁写法
((c = a + b)) # 赋值运算
echo $c
3.5 变量拓展
name="John"
echo ${name} # 基本扩展
echo ${#name} # 字符串长度: 4
echo ${name:1:2} # 子串: oh
# 默认值处理
echo ${var:-默认值} # 如果var未设置或为空,使用默认值
echo ${var:=默认值} # 如果var未设置或为空,设置为默认值
echo ${var:?错误信息} # 如果var未设置,显示错误并退出
echo ${var:+新值} # 如果var已设置,使用新值
3.6 数组操作
fruits=("apple" "banana" "cherry")
echo ${fruits[0]} # 第一个元素: apple
echo ${fruits[@]} # 所有元素
echo ${#fruits[@]} # 数组长度: 3
3.7 进程信息
echo $BASHPID # Bash进程的PID
echo $BASH_SUBSHELL # 子shell的嵌套级别
echo $SHLVL # Shell层级
4.cp命令——文件复制
# 基本语法
cp 源文件 目标文件
cp 源文件1 源文件2 ... 目标目录
# 常用选项
cp -r dir1 dir2 # 递归复制目录
cp -f file1 file2 # 强制覆盖,不提示
cp -i file1 file2 # 覆盖前询问
cp -u file1 file2 # 只复制更新的文件
cp -v file1 file2 # 显示复制过程
# 在脚本中的使用
cp ../tc/$1.v ../tc/pattern.v
# 将 ../tc/测试用例名.v 复制为 ../tc/pattern.v
5.条件判断(if——fi)
5.1 if-then语句
# 单行形式
if [ 条件 ]; then 命令; fi
# 多行形式
if [ 条件 ]
then
命令1
命令2
fi
5.2 if-then-else语句
if [ 条件 ]; then
条件为真时的命令
else
条件为假时的命令
fi
5.3 if-then-elif-else语句
if [ 条件1 ]; then
条件1为真的命令
elif [ 条件2 ]; then
条件2为真的命令
else
所有条件为假的命令
fi
示例:
if [ "$1" == "" ] ; then
echo "not new pattern set"
else
cp ../tc/$1.v ../tc/pattern.v
echo "now running pattern: $1"
fi
对于if条件判断语句:
if [ "$1" == "" ] ; then
echo "not new pattern set"
"$1":脚本的第一个参数(可参考3.2)“== ":判断是否为空字符串- 含义:检查调用脚本时是否提供了参数
sh run_vcs.sh # $1 为空
sh run_vcs.sh N008_soft_rstn # $1 = "N008_soft_rstn"
对于else语句:
else
cp ../tc/$1.v ../tc/pattern.v
echo "now running pattern: $1"
fi
- 如果提供了参数,执行文件复制操作
- 将指定测试用例复制为固定的 pattern.v文件
判断条件详解:
# 语法:[ 条件表达式 ]
# 注意:括号内前后必须有空格
# 字符串比较
[ "$var" = "value" ] # 等于
[ "$var" != "value" ] # 不等于
[ -z "$var" ] # 为空字符串
[ -n "$var" ] # 非空字符串
# 数字比较
[ "$a" -eq "$b" ] # 等于
[ "$a" -gt "$b" ] # 大于
# 文件测试
[ -f "file.txt" ] # 文件存在
[ -d "dirname" ] # 目录存在
[ -r "file.txt" ] # 可读
[ -x script.sh ] # 文件可执行
- 括号
# 简单比较用单括号
if [ "$var" = "value" ]; then
# 模式匹配用双括号
if [[ "$var" == *pattern* ]]; then
# 算术比较用双括号
if (( count > 10 )); then
6.mkdir命令——目录创建
# 脚本中方法
if [ ! -d $1 ] ; then mkdir $1; fi
cd $1
- 检查目录 $1是否存在($1是测试用例名,如 N008_soft_rstn)
- 如果不存在,则创建
- 然后进入该目录
带选项创建:
# 创建多级目录(自动创建父目录)
mkdir -p a/b/c/d
# 结果:a/b/c/d 整个路径被创建
# 创建目录并设置权限
mkdir -m 755 mydir
# 创建目录并设置权限为 rwxr-xr-x
# 创建目录并显示信息
mkdir -v dirname
# 输出:mkdir: created directory 'dirname'
# 设置目录所有者(需要权限)
sudo mkdir -o username dirname
创建复杂目录结构:
# 一次创建多级结构
mkdir -p project/{src,include,lib,doc,test}
# 结果:
# project/src/
# project/include/
# project/lib/
# project/doc/
# project/test/
# 嵌套创建
mkdir -p data/{2023/{Q1,Q2,Q3,Q4},2024/{Q1,Q2}}
# 带变量的创建
year=$(date +%Y)
mkdir -p "reports/${year}_analysis"
带时间的目录:
# 创建带日期时间的目录
mkdir "backup_$(date +%Y%m%d_%H%M%S)"
# 创建今天的目录
mkdir "$(date +%Y-%m-%d)"
# 创建以当前用户和时间命名的目录
mkdir "$(whoami)_$(date +%s)"
7. grep命令——文本搜索
# 基本语法
grep [选项] 模式 文件
# 常用选项
grep -q "pattern" file # 静默模式,只返回状态码
grep -i "pattern" file # 忽略大小写
grep -n "pattern" file # 显示行号
grep -v "pattern" file # 反向匹配,显示不包含的行
grep -r "pattern" dir/ # 递归搜索目录
grep -l "pattern" *.v # 只显示包含模式的文件名
grep -c "pattern" file # 统计匹配行数
grep -A 3 "pattern" file # 显示匹配行后3行
grep -B 2 "pattern" file # 显示匹配行前2行
grep -C 2 "pattern" file # 显示匹配行前后各2行
# 示例
grep "module" design.v
grep -i "^end" *.v
grep -r "clk" ./rtl/
8. sed命令——流编辑器
# 基本语法
sed [选项] '命令' 文件
# 常用选项
sed -i 's/old/new/' file # 原地替换(修改原文件)
sed -i.bak 's/old/new/' file # 备份原文件后替换
sed -n '1,5p' file # 只打印1-5行
sed -e 's/a/A/' -e 's/b/B/' file # 多个命令
# 常用命令
s/old/new/ # 替换
p # 打印
d # 删除
atext # 在行后追加
itext # 在行前插入
ctext # 替换整行
sed 替换的其他选项:
# 全局替换(所有出现的地方)
sed "s|old|new|g" file
# 只替换第N次出现
sed "s|old|new|2" file # 只替换第2次
# 只替换匹配行的第一次
sed "/pattern/s|old|new|" file
# 使用扩展正则表达式
sed -r "s|(pattern1|pattern2)|replacement|" file
示例:
# 替换文本
sed 's/foo/bar/g' file.txt
sed -i 's/old/new/g' *.txt
# 删除行
sed '/pattern/d' file.txt
sed '1,10d' file.txt # 删除1-10行
sed '$d' file.txt # 删除最后一行
# 插入/追加文本
sed '3i插入的行' file.txt # 在第3行前插入
sed '3a追加的行' file.txt # 在第3行后追加
sed '/endmodule/i插入代码' file.v # 在endmodule前插入
9. rm命令——移除
9.1 rmdir命令
# 基本语法
rmdir [选项] 目录名
# 常用选项
rmdir -p dir1/dir2/dir3 # 删除多级空目录
rmdir -v mydir # 显示删除信息
rmdir --ignore-fail-on-non-empty dir # 忽略非空目录错误
# 示例
rmdir emptydir # 删除空目录
rmdir -p a/b/c # 删除a/b/c,如果a,b都为空也删除
9.2 rm命令
# 基本语法
rm [选项] 目录名
# 常用选项组合
rm -r 目录名 # 递归删除(删除目录及其内容)
rm -rf 目录名 # 强制递归删除(不提示确认)
rm -ri 目录名 # 交互式递归删除(删除前询问)
rm -rv 目录名 # 详细模式递归删除(显示删除过程)









