makefile 初步学习与使用

makefile学习笔记 Makefile是一个用于构建软件的文件,其中包含了一系列规则和命令。本文讲述了makefile 的通用介绍:执行过程、概念、变量以及函数等。重点介绍了层次化的 Makefe 的两种编写方式,并配有实际可运行的Makefile的示例。 阅读详情

make 工具用于自动完成编译。自动编译的规则由makefile文件来规定。

使用make命令时,该工具默认在当前目录下依次搜索名为 GNUmakefile、makefile、Makefile 的文件来作为makefile。UNIX/Linux中常使用后两种。

也可以指定上述三种文件以外的其它文件作为makefile,须添加 -f 选项:make  -f  Makefile.debug


makefile的结构与语法

#开头的行为注释行。“\”为续行符。

基本格式为:

target:  dependency1  dependency2  ...
	<command>

即:

目标文件: 依赖文件(一个或多个)列表  #目标文件:要创建的二进制文件;依赖文件之间以空格隔开;
        <命令行>  #即make要执行什么动作来创建“目标”文件。必须TAB字符开头,独占一行。

目标-依赖-命令格式的一种特例:

clean:
	rm  -f *.o

这个特殊目标--clean的功能是删除所有的目标模块。

makefile中常见的一个C编译的命令是这样的:

$ {CC} $ {CFLAGS} $ {CPPFLAGS} $ {TARGET_ARCH} –c $< -o $@


makefile 中的变量

大小写敏感,一般在makefile的头部定义。包括用户自定义的变量、环境变量、自动变量和预定义变量。

自定义变量:

VARNAME=string #定义
${VARNAME} # 使用

预定义变量

常见的有:

$*  #不包含扩展名的目标文件名称。 
$+ #所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$^ #所有的依赖文件,以空格分开,不包含重复的依赖文件。
$< #第一个依赖文件的名称。 
$@ #目标的完整名称。 
$% #如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称 为 mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。
CC #C 编译器的名称,默认值为 cc。 
CFLAGS #C 编译器的选项。 
CPP #C 预编译器的名称,默认值为 $(CC) -E。 
CPPFLAGS #C 预编译的选项。 CXX C++ 编译器的名称,默认值为 g++。 
CXXFLAGS #C++ 编译器的选项。

 


按makefile的描述编译

可用:

$ make  target

它将生成makefile中定义的名为target的目标;

$ make 

缺省情况,则make将自动生成makefile中的第一个目标,同时也是make的最终目标,其后面的所有目标都为生成最终目标所必经的中间过渡。


示例

了解以上内容后,你也可以理解并写出如下示例中的makefile文件了:

OBJS=prog.o code.o
CC=gcc
 test:${ OBJS }
		${ CC } –o test ${ OBJS }
 prog.o:prog.c prog.h code.h
		${ CC } –c prog.c –o prog.o
 code.o:code.c code.h
		${ CC } –c code.c –o code.o
 clean:
		rm –f *.o 


Makefile还有一些隐含规则,在用户没有指定完整的某些命令时,make工具会自动地执行隐含规则所规定的动作。例如,target下一行没有command行,make会自动使用变量CC所指的编译器来编译依赖文件,以生成目标文件。可见,熟悉这些隐含规则可以简化我们的Makefile。例如上面的示例考虑隐含规则后可简化为:

OBJS=prog.o code.o
CC=gcc
test:${ OBJS }
		${ CC } –o $@ $^
 prog.o:prog.c prog.h code.h
code.o:code.c code.h
 clean:
		rm –f *.o 


make 的命令行选项

另外,make时还可以添加一些命令行选项,前面提到的-f就是其中之一,更多的选项如下:

-C DIR #在读取 makefile 之前改变到指定的目录 DIR。 
-f FILE #以指定的 FILE 文件作为 makefile。 
-h #显示所有的 make 选项。 
-i #忽略所有的命令执行错误。 
-I DIR #当包含其他 makefile 文件时,可利用该选项指定搜索目录。 
-n #只打印要执行的命令,但不执行这些命令。 
-p #显示 make 变量数据库和隐含规则。 
-s #在执行命令时不显示命令。 
-w #在处理 makefile 之前和之后,显示工作目录。 
-W FILE #假定文件 FILE 已经被修改。 





【原创,解决CLodop安装后无法调用的问题】已经安装过CLodop,但是网页上仍然提示“clodop云打印服务(localhost本地)未安装启动,点击这里执行安装....” 在某些国内web网站中,需要安装一个名为“CLodop”的插件;但在实际使用过程中,即使安装了CLodop插件,网页试图调用它时还是会提示“clodop云打印服务(localhost本地)未安装启动,点击这里执行安装...”,且无法完成相关打印任务 本文属原创博客,分析了解决CLodop无法被调用的问题,并附上了原理和解决方法,本质上是和跨域请求以及CORS类安全组策略相关 阅读详情

相关推荐

ArcGIS+PLUS+InVEST三件套实战:从零搞定土地利用变化与碳储量预测(附完整数据包)

本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建土地利用变化与碳储量预测的完整研究流水线。通过多情景模拟和生态系统服务评估,提供从数据准备到结果验证的实战指南,助力研究者高效完成生态评估项目。

weixin_30399821的博客 544

makefile——命令

显示命令 命令执行 命令出错 嵌套 make 定义命令包

bingshanzhu的专栏 1168

自动驾驶仿真 (三)—— 基于PreScan与Simulink的AEB系统仿真

自动驾驶仿真三—— 基于PreScan&Simulink的AEB系统仿真1. AEB自动紧急制动系统1. 1 TTC碰撞时间模型1. 2 C-NCAP法规部分术语与定义1. 3 主动安全ADAS系统试验项目2. AEB仿真分析建模2.1 搭建场景2.2 传感器建模2.3 添加AEB控制系统3. 典型工况仿真3.1 CCRs仿真测试3.1 CCRm仿真测试4. 参考学习的书目教材 博主前面的博文已经介绍了Prescan&Simulink基本的场景建模及仿真分析流程,《自动驾驶仿真 (二)——

zhudj08的博客 1万+

makefile基础知识3关于常用命令选项的使用

可以看我前面的系列文章: gcc编译器使用总结和makefile基本知识 makefile伪目标详解 makefile基础知识学习篇2 makefile编译过程中要想不输出编译展开的过程信息,那么加入-s参数即可 make -s -B是所有目标都强制更新,类似先make clean,再make一样 -h可以打印出帮助,所有相关命令选项也都可以介绍出来了 伪命令可以内部包含其它命令, $(TARGET).bin : $(OBJS) clean: rm -rf $(TARGET)...

biao2488890051的博客 774

超详细版risc-v五级流水线cpu硬件设计实现解析

深入剖析risc-v五级流水线cpu的硬件架构与设计细节,涵盖指令流程、模块划分与关键时序控制,帮助理解risc-v五级流水线cpu的工作机制与优化策略。

weixin_42437253的博客 1633

深度学习实战:基于YOLOv5/v8/v10的快递暴力分拣检测系统(完整版)

在电商物流高速发展的今天,快递包裹日均处理量已突破亿件级别。然而,快递分拣过程中的暴力抛扔行为不仅造成包裹损坏,更带来巨大的经济损失。据统计,每年因暴力分拣导致的快递破损投诉占总投诉量的30%以上。传统的人工监控方式存在疲劳、疏漏等问题,因此开发一套智能化的快递暴力分拣检测系统具有重要的现实意义。

YOLO 275

Makefile中的一些小知识点,及常用的makefile举例

1、gcc -s(注意是小写的s)命令是什么意思?为什么用此命令编译后的程序比用优化后的程序还小? 这个参数会把符号表从最终的可执行文件中删除。没有符号表,你就不能用gdb调试了,常见的用法是: 比方说你的程序由 1.c 2.c 3.c 组成,那么你编译的时候应该是这样的 gcc -g -c 1.c gcc -g -c 2.c gcc -g -c 3.c 然后链接成可执行文件 gcc -o test 1.o 2.o 3.o 此时生成的 test 是可以用gdb来调试的,因为它包括了符号表等调试信息。 但是如

阿乐的博客 2759

【WRF模拟】土地利用类型的确定:最大覆盖法/瓦片法

土地利用类型的确定:最大覆盖法/瓦片法

WW、forever的博客 1529

Makefile 语法简介

http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=185 有稍稍在Linux下碰过程式设计的开发者应该会知道, make是用来将程式码、函式库、标头档及其它资源档build成最终成果(即:最终的应用程式)的超强力辅助工具。  当然了,并不是非得动用到make才能build程式,或许有什么程式设计魔人喜欢什么都自己手

s_k_yliu的专栏 1457

在Simulink中构建永磁同步电机的网络化控制模型,并分析通信网络对系统性能的影响

核心优势通过仿真验证了网络延迟和丢包对PMSM控制性能的影响。提供了改进PI参数或引入自适应控制的解决方案。扩展方向抗干扰控制:结合卡尔曼滤波或滑模控制抑制网络噪声。时间敏感网络(TSN)建模:参考知识库[2]的中断触发方式,实现确定性通信。网络安全仿真:模拟恶意攻击(如数据篡改)对控制系统的威胁。

xiaoheshang_123的博客 168

【固态变压器(SST)全维度解析】发展历史、技术、玩家、挑战与数据中心趋势

SST正处于技术突破向规模化商用的关键过渡期,随着SiC/GaN器件降价、标准完善、可靠性数据积累,其在数据中心的渗透率将快速提升。短期(2025 - 2027年)以示范项目为主,中长期(2030年后)有望成为超大规模智算中心的主流供电方案。

昔时扬尘处 2128

Makefile(08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

shellshell。

stephenbruce的博客 1556

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【Ubuntu系统的初步学习及使用gcc和makefile编译程序】

Ubuntu系统学习,gcc,makefile

chenyu128的博客 137

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

初步学习嵌入式开发系统,Ubuntu系统使用gcc和Makefile编译C程序

(一)在Ubuntu中学习编写一个主程序文件 main1.c 和一个子程序文件 sub1.c,子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;主程序main1.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来。 编写main1.c 编写sub1.c 编写sub1.h (二)使用...

qq_52772319的博客 214

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

201029阶段二Linux动态库、makefile

目录一、学习的知识点二、上课没有听懂或者没有理解的地方三、当天学习的收获 一、学习的知识点 二、上课没有听懂或者没有理解的地方 对动态库的链接还有些不懂 三、当天学习的收获 初步了解了动态库的创建和makefile ...

pear_11的博客 137

linux实验三makefile,Linux_Makefile实验1

实验格式等实验二 Makefile实验【实验目的】1、了解Makefile的基本概念和基本结构2、初步掌握编写简单Makefile的方法3、了解递归Make的编译过程4、初步掌握利用GNU Make编译应用程序的方法【实验原理】在Linux或Unix环境下,对于只含有几个源代码文件的小程序(如hello.c)的编译,可以手工键入gcc命令对源代码文件逐个进行编译;然而在大型的项目开发中,可能涉及几...

weixin_39636608的博客 370

对 Makefile 的初步学习与运用

对 Makefile 的初步学习与运用欢迎使用Markdown编辑器新的改变附录 我的 Makefile 欢迎使用Markdown编辑器 新的改变 附录 我的 Makefile DIR_INC = ./include DIR_SRC = ./source DIR_OBJ = ./obj VPATH = $(DIR_INC):$(DIR_SRC) XX = clang++ --target=x86...

Daning_NFH的博客 354

Makefile学习总结

Makefile是一种用于自动化构建过程的脚本文件,广泛应用于软件开发中。它定义了如何从源代码构建目标文件(如可执行文件或库文件)的一系列规则和依赖关系。Makefile通常与make工具一起使用,make是一个命令行工具,它可以解析Makefile中的指令并执行相应的构建任务。目标(Target):Makefile 中的一个目标通常是一个文件,它是由一系列依赖文件通过一个或多个命令生成的。最终的目标文件通常是可执行文件或库文件。依赖(Dependencies)

studyingdda的博客 1586

【makefile】初步学习

makefile简单示例学习

v_ampire_的博客 1029

跟我一起由浅入深学习Makefile

首要目标是读懂复杂makefile,从makefile执行过程梳理剖析工程,然后就是能够写makefile管理工程项目

保持一颗永远好奇、勇于探索的心 3522

对于makefile的初步的理解

对于makefile的初步的理解 今天刚刚学习了make这个工程管理器,下面是主要我今天对于这个工程管理器的学习到的知识以及一些例子。 gcc提供了半自动化的工程管理器Make,所谓的半自动化是指在使用工程管理器前都需要人工的编写程序的编译规则,所有的编译规则都保存在Makefile文件中,全自动化的工程管理器在编译程序前会自动的生成Makefile文件。 Make工程管理器的优越性有以下两

程序猿养成记 1369

Linux学习之makefile

本文相信介绍了Linux中makefile的理论并且每一步都有实操,配有多张图片。我将带你一步一步优化你写的makefile,中间没有一点跳跃,保证你能听一遍就明白。还不赶紧点进来学习提升自己吧!!!

yourgrandfather_的博客 1457

Makefile学习

简述 Makefile是一种被用作自动化编译,Makefile定义了一系列的规则来指定文件编译顺序,以及哪些文件需要重新编译,甚至可以像shell脚本一样执行操作系统的命令。 本篇只是简单概念及使用方式,详细的可参考:C语言中文网-Makefile教程 规则 普通规则 target... : prerequisites ... command ...... 模块 描述 target 可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(l

菜鸟不会飞 4486

MakeFile学习

Makefile 是项目构建的“指挥手册”,通过定义文件依赖和编译命令,实现了程序构建的自动化和高效化。对于单片机开发等多文件项目,使用 Makefile 可以显著减少重复劳动,尤其在脱离 Keil 等 IDE 时,是搭建编译环境的核心工具。

qq_43582136的博客 1330

8.makefile初步编程学习

8.1.makefile概述8.2.目标、依赖、命令 8.3.通配符%和自动推导 8.4.makefile中定义和使用变量 8.5.伪目标.PHONY 8.6.文件名 8.7.makefile中引用其他makefile 8.8.注释用# 8.9.命令前面的@用来静默执行 8.10.变量赋值运算符 8.11.环境变量 8.12.通配符 8.13.自动变量

Rston's Notes 690

Makefile学习笔记

定义方式# <变量名> = <变量值> <变量名> := <变量值> <变量名> ::= <变量值>变量名区分大小写,可以是任意字符串,不能含有":", “#”, “=”使用方式# $(<变量名>) 或者 ${<变量名>}main.o : $(files) # 或者 ${files}...如果变量名只有一个字符,使用时可以不用括号,如$a, $b, 但不建议这样用,不管是否只有一个字符都写成$(a), $(b)这种形式前面定义的变量都是单行的。变量值有多行,多用于定义shell指令语法。

weixin_47718607的博客 716
上一篇: C++中实现从std::string类型到bool型的转换
下一篇: grep使用多个查询条件--或
量子波儿
博客等级 码龄18年 12粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值