编译当前目录下的所有.c文件

#!/bin/bash

if [ $# -lt  ] ;then  #如果输入参数小于1则报错  $# == C语言中的argv[] 输入参数个数
echo "Please follow up file.c!"
echo "eg: ./make.sh xxx.c"
exit
fi if [[ $ = "debug" ]] ;then #如果第三个参数是debug的话,就是编译调试
FILE2=$
echo ${FILE2}
NAME=${FILE2%.*} #截取输入要编译文件的.之前的内容 比如 hello.c NAME = hello
echo "NAME"
echo ${NAME}
gcc -g ${FILE2} -o ${NAME} #加上-g用于gdb调试
gdb ${NAME} else #否则就直接运行
FILE1=$
NAME=${FILE1%.*}
gcc ${FILE1} -o ${NAME} if [ -r ${NAME} ] ;then
echo "test file is creature,Over! ";
./${NAME}
else
echo" Error!"
fi fi

用于编译调试指定C代码。

./make.sh 文件名(必选)debug(调试,可选)

#!/bin/bash

for file in ./*.c
do
if [ -f $file ];then
file=${file#./}
target=${file%.c}
echo "file ${file}"
echo "target ${target}"
gcc -o $target $file
echo $target
fi if [ -d $file ] ;then
echo $file is dictionary
fi
done

exbot@ubuntu:~/shareWin/shell/20190925$ ./4.sh
file hello.c
target hello
hello
file world.c
target world
world

for file in ./*.c

这句话意思是寻找当前目录下所有.c文件把用./作为前缀,比如hello.c在运行之后就变成了./hello.c

file=${file#./}

这个是舍弃file名中最左边的./之前的的所有字符。比如./hello.c 转换成 hello.c

file=/dir1/dir2/dir3/my.file.txt

${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
${file##*.}:删掉最后一个 .  及其左边的字符串:txt
${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file::}:提取最左边的 个字节:/dir1
${file::}:提取第 个字节右边的连续5个字节:/dir2

字符串替换

${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt

利用 ${ } 还可针对不同的变数状态赋值(沒设定、空值、非空值):

${file-my.file.txt} :假如 $file 沒有设定,則使用 my.file.txt 作传回值。(空值及非空值時不作处理) 
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作处理)
${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作处理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作处理)
${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作处理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為my.file.txt 。 (非空值時不作处理)
${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作处理) ${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (非空值時不作处理)
${#var} 可计算出变量值的长度: ${#file} 可得到 ,因为/dir1/dir2/dir3/my.file.txt 是27个字节
#/bin/bash

for file in *.c
do
if [ -f $file ];then
target=${file%.c}
gcc -o $target $file
echo $target
fi if [ -d $file ] ;then
echo $file is dictionary
fi
done

运行结果:

exbot@ubuntu:~/shareWin/shell/20190925$ ./4.sh
hello
world

shell编程题(四)的更多相关文章

  1. 小鸟初学Shell编程(四)管道符

    管道作用 管道实际上就是进程之间的一个通信工具,那么用在Linux命令中主要是方便两条命令互相之间可以相互通信. 管道符 管道符(匿名管道)是Shell编程经常用到的通信工具. 管道符是"| ...

  2. [转]Windows Shell 编程 第四章 【来源 http://blog.csdn.net/wangqiulin123456/article/details/7987933】

    第四章 文件的本质 以前,所有文件和目录都有一个确定的属性集:时间,日期,尺寸,以及表示‘只读的’,‘隐藏的,‘存档的’,或‘系统的’状态标志.然而,Windos95(及后来的WindowsNT4.0 ...

  3. shell编程练习(四): 笔试31-68

    笔试练习(四): 31.找查较多的SYN连接 netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uni ...

  4. 【shell】shell编程(四)-循环语句

    上篇我们学习了shell中条件选择语句的用法.接下来本篇就来学习循环语句.在shell中,循环是通过for, while, until命令来实现的.下面就分别来看看吧. for for循环有两种形式: ...

  5. shell编程基础(四): shell脚本语法之函数及调试

    一.Shell脚本中的函数 和C语言类似,Shell中也有函数的概念,但是函数定义中没有返回值也没有参数列表.例如: #! /bin/sh fun(){ echo "Function fun ...

  6. Shell编程(四)Shell变量

    1. 自定义变量(仅在当前shell生效) 1.1 定义变量 #!/usr/bin/bash ip=115.239.210.27 if ping -c1 $ip &>/dev/null ...

  7. shell编程题(一)

    求2个数之和 #!/bin/bash function add { )); then echo "The arg in't correct" else +$)) echo $sum ...

  8. shell编程第四天

  9. Python和Java编程题(四)

    1.题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身. 分析:只需要对三位数的数字进行循环(100~999),判断三 ...

随机推荐

  1. JavaTCP粘包、拆包

    import java.nio.ByteBuffer; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBu ...

  2. TeX 家族(TeX, pdfTeX, XeTeX, LuaTeX, LaTeX, pdfLaTeX, XeLaTeX …)

    TeX 家族 带有 TeX 的词,仅仅是本文就已经提到了 TeX, LaTeX, XeLaTeX.通常中国学生面对不了解意思的一群形近单词,都会有一种「本能的恐惧」(笑~).因此,「大神们」在为新手介 ...

  3. JS获取时间差

    Date.parse(String string)转为毫秒数进行比较

  4. java之hibernate之helloworld

    这篇文章,会一步一步的演示hibernate的使用. 目录结构如下: 1.新建java项目 2.增加一个lib文件夹,并把 hibernate必须的jar包 和 数据库驱动包 一起复制进去 然后把hi ...

  5. c#的一些书写技巧

    从非创建线程访问线程资源 Invoke(new Action<int>((o)=> {  textBox1.Text = (Convert.ToInt32(textBox1.Text ...

  6. mtd交叉编译mkfs命令

    下载 mtd:ftp://ftp.infradead.org/pub/mtd-utils/ zlib:http://www.zlib.net/ lzo:http://bouchez.info/lzo. ...

  7. react基础学习和react服务端渲染框架next.js踩坑

    说明 React作为Facebook 内部开发 Instagram 的项目中,是一个用来构建用户界面的优秀 JS 库,于 2013 年 5 月开源.作为前端的三大框架之一,React的应用可以说是非常 ...

  8. 在编译内核的最后阶段出现sdhci_esdhc_imx_pdata未定义的错误

    遇到下面这种错误 在网上查找资料后,发现一篇好文,提出了良好的找错误的策略: (1)利用grep命令查看该变量在何处使用: (2)查看相应的头文件是否在Kconfig中被定义且在make menuco ...

  9. java sql: PrepareStatement

    参见菜鸟教程:JDBC 使用说明 增删改查: public class DbUtil { public static final String URL = "jdbc:mysql://loc ...

  10. gdb调试(一)

    对于gdb是什么,这里就不多说了,只要是程序员一般都听说过,像java开发会用到集成开发工具eclipse,里面调试起来非常方便,全是可视化的,但是如果在linux下编写的c程序,用可视化的调试就没这 ...