shell 编写 (修改run tcl的脚本,测试clang_O1_O3)

本文深入探讨了Shell脚本的基础知识与高级技巧,包括数组操作、条件语句、数学运算及文件处理。通过实例展示了如何利用Shell进行复杂的任务自动化,如批量文件处理和目录遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/bin/bash
#j=0
#for i in `ls -1`
#do 
#  folder_list[j]=$i
#	j=`expr $j + 1`
#done
#
#for n in ${folder_list[@]};
#do 
#	echo ${n}
#done

case_array=($(awk '{print $1}' list))
for test_case in ${case_array[@]};do
	cp run.tcl /home/cpan/workspace/esl_0.2_rm_struct/CHStone_O3/$test_case
	cd $test_case
	sed -i "s/adpcm/${test_case}/g" run.tcl
	#../../bin/Linux_64/esl-debug run.tcl
	#sed -i '/#run_hw ${design}_O1/arun_hw clang_O1_O3.bc' run.tcl
	cd ../

	echo "$test_case"
done

ps:shell中用的不是单引号,特别注意,方括号中必须加空格
sed中-i是对源文件进行修改,可以先不加测试一下。其中/a是插入下一行,/i是插入上一行。
1、用ESL_0.2的rm_struct pass 跑每个case,case目录下会生成一个没有struct的clang_O1_O3.bc的文件。
2、将clang_O1_O3.bc文件在拷贝到ESL_0.1对应case目录下,准备进行仿真。
3、需要将ESL_0.1下case中run.tcl修改。

Shell 基本运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"

a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a \* $b`
echo "a * b : $val"

两点注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
乘号(*)前边必须加反斜杠()才能实现乘法运算;
if…then…fi 是条件语句

#注意等号两边不要留空格

Shell 数组
读取数组
读取数组元素值的一般格式是:

${array_name[index]}

使用@ 或 * 可以获取数组中的所有元素

传递参数

Shell 变量

(1)判断输入参数1是否为空

if [ ! -n "$1" ];then
  echo "Missing processing file parameter!\n"
  exit 1
fi

【】内部必须有空格。

(2)如何用shell命令分割传递的参数(比如文件名)
比如分割netperf-2.7.0.tar.gz

#!/bin/sh
netperfpath=$1
array=${netperfpath//./ }echo array[0]

可以这么理解,//,/ 就是将,替换成空格(还可以如//t/b将t转换为b);如果string="aa bb ccc"那么其实可以直接array=($string)就能将字符串转换为数组;

(3)OpenDot.sh 根据参数运行命令

#!/bin/bash
#if [ $# < 2 ];then
if [ ! -n "$1" ];then
  echo "Missing processing file parameter!\n"
  exit 1
fi

name=$1
array=(${name//./ })
echo $array
dot -Tjpeg $1 -o $array.jpeg
eog $array.jpeg &

查询指令:

find . -name "*.c" | xargs grep "ReadBuf"
<think>嗯,用户问的是关于一些C/C++预处理指令和编译器指令的内容,看起来像是Clang编译器特定的代码。首先,我需要确定用户对这些概念的了解程度。可能用户是在阅读或编写代码时遇到了这些指令,想要了解它们的作用。 用户给出的代码片段里有#ifdef __clang__,这里检查是否使用Clang编译器。接着是#pragma clang diagnostic push和#pragma clang diagnostic ignored "-Wpass-failed"。然后是#endif。 我需要解释每个部分的作用。首先,#ifdef __clang__是条件编译,判断当前是否用Clang编译。然后,#pragma指令是编译器特定的,Clang的diagnostic push用于保存当前的诊断设置,然后忽略特定的警告-Wpass-failed。这个警告可能在优化失败时触发,比如当编译器无法应用某些优化选项时。 接下来要考虑用户可能的背景。可能是开发过程中遇到了这个警告,想关闭它,或者是在第三方代码中看到这些指令,想要理解其用途。需要解释为什么需要暂时禁用警告,以及push和pop的作用,确保不影响其他代码部分的警告设置。 还要注意用户可能不太熟悉编译器指令,所以需要用简单的语言解释,避免过于技术化。同时,提醒用户谨慎使用这类指令,确保理解警告的原因后再决定是否禁用,避免隐藏潜在问题。 最后,确认回答结构清晰,分点解释每个指令,并给出使用示例,说明恢复警告设置的通常做法,即使用pop。这样用户不仅能理解当前代码,还能知道如何正确管理编译器的诊断信息。</think>这些代码属于C/C++预处理指令和Clang编译器特定的诊断控制指令,我为您分步解释: 1. `#ifdef __clang__` - 这是条件编译指令,用于检测当前是否使用Clang编译器进行编译 - `__clang__`是Clang编译器预定义的宏标识符 2. `#pragma clang diagnostic push` - Clang特有的编译指令(pragma) - 将当前编译器诊断设置压入栈中保存(类似于保存当前警告设置的状态) 3. `#pragma clang diagnostic ignored "-Wpass-failed"` - 临时禁用特定编译器警告 - `-Wpass-failed`表示要忽略的警告类型(当编译器优化pass失败时触发的警告) - 这个警告通常在编译器无法应用某些优化时产生 4. `#endif // __clang__` - 结束条件编译块,表示只在Clang编译器环境下执行上述指令 **典型应用场景**: ```cpp #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wsome-warning" #endif // 这里放置可能触发警告的代码 #ifdef __clang__ #pragma clang diagnostic pop // 恢复之前的诊断设置 #endif ``` **注意事项**: 1. 这种写法可以确保只在Clang编译器下生效 2. `push/pop`机制可以保持诊断设置的局部性,避免全局设置污染 3. `-Wpass-failed`警告通常出现在编译器无法应用某些优化选项时(如`-O2`优化级别下的某些情况) **建议**:除非明确了解警告内容且确认可以忽略,否则不建议随意禁用编译器警告。更好的做法是优先解决代码中的潜在问题,而不是直接禁用警告。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值