Linux基本命令

ctrl +alt +t  打开新终端
 
 sudo shutdown -h now    关机
               -r +分钟数  重启
               
    
vi:
   输入模式 i   a  
   底行模式
   命令模式   
   视图模式:v  进入视图模式
    
命令:
dd  剪切
yy  复制
p/P 粘贴
r: 修改光标上的字符
R:  修改后边的字符,直到命令结束

<b>    移动到当前单词的开始
<e>  移动到当前单词的结尾
 db:  删除单词
 
 dw:  删除单词
 
 debain: deb
 redhat: rpm
 
 
 deb包的组成: 软件包名_版本号_体系架构.deb
 
 deb包的管理机制:
 1、本地管理(无法解决依赖关系)  需要sudo  dpkg 命令
 dpkg -i <package.deb>   安装一个在本地文件系统上存在的Debian软件包
 dpkg -L <package>   列出安装的软件包清单  
  
 dpkg -r <package>    移除一个已经安装的软件包
 dpkg -P <package>   移除已安装软件包及配置文件

 dpkg -s  <package>    显出软件包的安装状态(是否已经安装) 
   
 2、在线管理(可以解决软件包之间的依赖关系)
    apt-get
    apt-cache
 
 安装包的镜象站点  /etc/apt/sources.list   
 本地软件包索引:   /var/lib/apt/lists
 sudo   apt-get   update  用来更新本地索引, 即更新 /var/lib/apt/lists 
 sudo  apt-get  install  xxxx(软件包名, 不是全称)      安装软件包
 sudo  apt-get  remove --purge  xxx                     彻底卸载软件包
 
 安装包的自动下载目录: /var/cache/apt/archives/
 sudo apt-get clean/autoclean    删除自动下载目录下的deb包
 
 sudo apt-get --reinstall install  xxxx   在不卸载的时,重新进行安装。
 sudo apt-get source xxx   就是下载xxx的源码到当前目录下
 sudo  apt-get upgrade  升级软件包
 
 sudo apt-cache  
 sudo apt-cache policy xxx  查看已经安装的软件包的状态
 sudo apt-cache show  xxx   列出软件包的详细信息
 sudo apt-cache  showpkg  xxx  
 sudo apt-cache depends xxx  找到xxx所依赖的软件包
 sudo apt-cache rdepends xxx  找到依赖于 xxxx的软件包


shell:  Linux中的Shell就是Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互 
        Shell是一个命令行解释器
        
ys@ys-ubuntu:/$ 
用户名称@主机名称:当前路径$(普通用户)
whoami 列出当前登录的用户名称
hostname 列出当前登录的主机名

命令的使用格式: 
  Command [-Options] Argument1 Argument2 …
   命令      选项     参数
   dpkg     [-i]        sl
   
 一行运行多个命令:需要使用”;“作为分隔符
                  比如: ls  ; cd  / 
                  
如果一条命令不能在一行写完,在行尾使用反斜杠(\)标明该条命令未结束:
   比如:  ls  \
            /home/ys    表示列出/home/ys目录中的文件名
            
            
自动补全:
 文件名: 一次tab键    
 命令补全: 两次tab键 
 
 history: 查询历史执行的命令
 history  列出所允许的最大命令个数
 history   10  列出最近操作的10个命令
 echo  $HISTSIZE   查看环境变量 HISTSIZE的值
 彻底修改HISTSIZE的值: 修改 家目录中 /home/linux/.bashrc 中的  HISTSIZE的值即可
 修改完成之后需要执行  source  ./bashrc  重启配置文件
 
 shell的通配符:
 ”*“ :表示匹配任意长度的字符串
 ”?“ :匹配任意一个字符
 ”[ ]": 匹配中括号中的一个字符。
     比如 [0-9] 匹配0-9的数字
          [a-z]  匹配a-z小写字母
          [A-Z]  匹配A-Z大写字母
          [0-9a-zA-Z] 匹配数字、字母
要想匹配多个,需要使用多个[]来完成
    
[^abc]    :表示除了a b  c 三个字符外都可以匹配

管道:管道可以把一系列命令连接起来,意味着第一个命令的输出将作为第二个命令的输入,通过管道传递给第二个命令,第二个命令的输出又将作为第三个命令的输入,以此类推。就像通过使用“|”符连成了一个管道。

wc 命令(文件操作):列出行、字符个数、 单词个数
wc -c  统计字符个数 
wc -w  统计单词个数
wc -l(字母)  统计行数

输入输出重定向:
“>"  :表示输出重定向 后边需要跟一个目标文件。
     比如: ls > file  将ls的输出结果写到文件file中
             file文件如果没有,就会被创建;如果已经存在就将原内容清空。
             
”>>"  :表示输出重定向,将输出内容追加到目录文件中。
        ls  >> file   将内容追加到file文件中。

“<"  :表示输入重定向
     wc -w  <  file  将内容作为输入源传递给命令
     
”2> ": 表示错误输出重定向
        gcc 的编译错误 2> file 
如果是文件执行的结果重定向,那么“>" ,将正确输出定向到文件中,错误还是会显示到终端        
如果是文件执行的结果重定向,那么“2>" 将错误输出定向到文件中, 正确的会显示到终端上。    

”&>" :表示将所有的信息输出重定向到文件中。    

命令置换:将一个命令的输出作为另一个命令的参数
pwd 命令:显示当前所在的绝对路径

命令格式: 命令1  `命令2`
            将命令2的结果作为命令1的参数来使用
            ls `pwd` 列出当前路径下的文件名
            
命令别名:alias
alias cc='gcc'   注意是单引号
  相当于 为gcc 起别名叫cc    
alias  新名字='原名字' 

去除别名:unalias
 unalias ll(要去除的别名)    
 
 
shutdown 命令: 
sudo  shutdown  -r  +10   重启(10)
sudo  shutdown  -r  now  立刻重启
sudo   shutdown -h  now  立刻关机
sudo   shutdown -h   +10   关机时间
sudo   shutdown -c  立刻取消正在执行的shutdown操作
sudo   shutdown  -k  +时间    发送一个广播告诉其他登录的用户要进行关机操作,但是不会真正关机。
sudo  shutdown -f/-n     其他关机方式

修改密码:
passwd  修改自己的密码
sudo  passwd  user   要修改user用户的密码
比如给超级用户设置密码: sudo passwd root 

su : 直接切换到超级用户
exit:  退出当前的用户

su  用户名:  表示切换到该用户

echo:输出命令, 自带换行符
echo  "hello world"   就是原样输出字符串
echo   hello     world   就是将空白缩短到最小
echo -n  xxxxx   输出语句不带换行符


获得系统时间:date
修改系统时间: sudo date -s  "year -mon -day  h:m:s"

修改时区: 需要将  /etc/localtime  文件替换为   /usr/share/zoneinfo/Asia/Shanghai    

清楚终端上的显示:clear
ctrl + L   ==== clear

df: 查看磁盘空间的使用情况
df -h  以合适的数据单位显示磁盘使用
df -T   显示文件系统的信息
df -Th   显示文件系统的信息,以合适的单位

df -a  显示所有物理文件系统的使用情况,包括虚拟文件系统,如/proc、/sys等
df -k  以kB为单位显示

df -aTh

du: 查看文件使用此磁盘的情况
du  -mh  file(文件)   以合适的单位显示文件占用磁盘情况
du  -sh  xxx(目录)   查看目录占用磁盘空间

用户管理:

/etc/passwd  :记录系统用户的信息
ys      :x      :1000:1000:      ys,,,:      /home/ys      :/bin/bash  
用户名  密码     用户id 组id     个人信息    家目录         对应的shell解释器

/etc/shadow  :存放着用户的密码

/etc/group :存放着用户组信息
  ys:    x        :1000:  改组的成员
  组名   组密码    组id

添加新用户:
sudo  adduser  用户名
添加过程 从 /etc/skel 目录中复制文件到新用户的家目录下

su  用户名:  表示切换到该用户
exit  表示从当前登录的用户中退出

删除用户: 
sudo  deluser  要删除的用户名
彻底删除用户(包括家目录): sudo  deluser --remove-home  用户名

小问题:要执行删除用户的操作, 必须要保证该用户不在登录状态(exit退出)。

在一个已经存在的用户组添加一个新用户:
sudo  adduser  新用户名  --ingroup 组名

添加一个用户组:
sudo  addgroup  组名

删除一个组:
sudo  delgroup  组名

vipw:  直接打开/etc/passwd 文件
sudo  vipw  

usermod: 修改用户属性
sudo usermod -p  xxx   用户


查看进程:
ps 查看正在运行的进程
ps -ajx 显示当前系统中的进程的详细信息
ps -aux  显示当前系统中的进程的详细信息

top:命令 ,动态显示系统当前的使用情况
pstree: 显示当前系统中的进程的树状图

kill 命令: 是用来发送信号的
kill -l(是字母)  列出当前系统所支持的信号类型
kill -9  pid   杀死pid的进程(发送一个杀死信号)


修改文件的属性:chmod  chown  chgrp
chown:修改文件的属主
       修改文件所属于的用户:sudo  chown 新用户  文件
       同时修改文件的属主和组: sudo chown 用户:组   文件
       
chgrp: 修改文件所属于的组
       sudo chgrp  新组名  文件       
       
chmod:就是修改文件的权限。
      文件权限?                   
       ll  命令可以列出文件的权限  读、写、执行
                                    rw-        rw-          r-- 
                                   属主权限   属组的权限   其他人的权限
       r: 表示该文件可读
       w: 表示文件可写
       -:表示什么没有
       x: 表示可以执行(有执行权限)
       
       chmod  664  file  表示将文件的权限修改为  rw- rw-  r--
                                                 110 110   100
       chmod  777  file  表示将文件的权限修改为  rwx rwx  rwx    
              

文件系统:就是对磁盘的访问和管理的一种机制
linux文件系统分类:
 磁盘文件系统:针对真实的存储介质,
 FAT16、FAT32、NTFS 、ext2、 ext3 、ext4
 
 网络文件系统:是可以远程访问的文件系统
 
 虚拟文件系统:存在于内存当中, 常见的有tmpfs proc  sysfs

sudo usermod  -G linux  yys    关联yys用户和linux组,这样就可以在/etc/group中看到成员列表

文件系统:就是对磁盘的访问和管理的一种机制
linux文件系统分类:

 磁盘文件系统:针对真实的存储介质,
 FAT16、FAT32、NTFS 、ext2、 ext3 、ext4
 
 网络文件系统:是可以远程访问的文件系统
 
 虚拟文件系统:存在于内存当中, 常见的有tmpfs proc  sysfs
 
 系统上的硬盘:/proc/partitions文件查看
               df -aTh
               
linux上一切皆文件(操作方式按照文件来操作)               

分区:
linux的分区在目录中  / 20G 
                     /home  10G
windows的目录在分区中

文件与目录的操作命令:
pwd  获得绝对路径

ls:
ls -a  列出当前目录下所有文件, 包括隐藏文件
.  当前目录
..  代表上层目录
ls -l  列出文件的详细信息
ls -R  递归的显示当前目录中的所有文件
ll  列出文件详细信息

-         rw-------    1            ys   ys       5618          Jul 23 20:48    file
文件类型   权限       硬链接个数   用户  组        大小(字节)  最后修改时间    文件名

linux文件类型:有7种
 b  属于块设备
 c  字符设备
 d  目录
 -  普通文件
 l  链接文件(软连接)
 s   套接字(网络)
 p   管道

cd: 改变工作目录的

cd     表示回到家目录
cd ..   进入上层目录
cd .    当前目录
cd ~     表示回到家目录
cd /ect/init.d/xxxx/    按照绝对路径进入某一个目录中
cd ../../../../    进入上上层目录
cd  dir        进入当前目录中的dir目录
cd  ~/C/xx    进入家目录/C/xx目录中
cd  -        进入上一次操作的目录

touch  1)创建一个新文件
       2)更改文件时间戳
       
file:  命令功能用于判定一个文件的类型、格式、运行架构等
file  xxxx(文件)

cp: 文件或者目录复制
文件操作:
cp  file1   file2     将当前目录中的文件file1, 复制一份改名为file2
cp  file1   /xx/xxx/  将当前目录中的文件file1, 复制到绝对路径中名字不变
cp   file1   /xxx/xxx/file2   将当前目录中的文件file1, 复制到绝对路径中名字变为file2
cp  /xxx/xx/file1  .(必须有目的路径)   将绝对路径中的文件file1 复制到当前目录, 名字不变
cp  /xxx/xxx/file1   /yyyy/yyy/    将绝对路径中的file1复制到绝对路径中,名字不变
cp  /xxx/xxx/file1   /yyyy/yyy/file2    将绝对路径中的file1复制到绝对路径中,名字变为file2

目录操作:
cp  dir1   dir2  -a   复制当前的dir1目录,改名为dir2
-a:  拷贝所有的东西,包括软连接
-r:   递归拷贝,软连接会丢失

cp  dir1  /xxx/xxx  -a   将当前目录中dir1, 复制到绝对路径中名字不变
cp dir1 /xxx/xxx/dir2  -a  将当前目录中dir1, 复制到绝对路径中名字变为dir2
cp  /xxxx/dir1   /yyy/   -a   将绝对路径中dir1 复制到绝对路径中目录, 名字不变
cp  /xxx/dir1  /yyyy/dir2  -a  将绝对路径中dir1 复制到绝对路径中目录, 名字变为dir2


mv: 
     1)移动文件
     2)重命名     
     
mv file1  file2  将当前目录中的file1重命名为file2
mv  dir1  dir2   将当前目录中的dir1重命名为dir2    
mv file1 /xxx/xxx/  将当前目录中的file1  移动到绝对路径中,名字不变
mv file1 /xxx/xxx/file2   将当前目录中的file1  移动到绝对路径中,名字变为file2
mv  /xxx/file1  /yyy/    将绝对路径中file1复制到绝对路径中目录, 名字不变
mv  /xxx/file1  /yyy/file2    将绝对路径中file1复制到绝对路径中目录, 名字变为file2
mv  /xxx/file1   /xxx/file2  修改绝对路径中的文件名字


rm: 删除命令(谨慎操作)
rm  file   删除文件
rm   file*  通配符删除

-r :递归删除,操作目录
-f: 忽略文件或者目录是否存在
rm -rf  dir1   删除目录dir1
rm -rf /xxx/yy/dir1   
rm 删除目录的特点:无论目录是否为空,都可以删除。

mkdir:  创建目录
mkdir  xxx   在当前目录中创建一个目录xxx
mkdir  /xxx/xxx/dir   在绝对路径中创建一个目录
mkdir -p /xxx/yyy/zzz   嵌套创建多级目录
rmdir 只能删除空目录

cat  :查看文件内容
cat  file 在终端上显示该文件的内容
cat -n 显示文件内容时,携带行号。
cat -vE  file   在文件每一行的结尾添加一个$符号
cat  xxx  > file  重定向时使用

echo "helloworld" > file 

head :从头查看文件的前几行内容
head  -10  file   表示要查看file文件的前10行。

tail: 从文件结尾显示后几行内容
tail -10  表示显示后10行

head、tail配合使用:
head -xx  file | tail -xxx 


软链接:相当于快捷方式,源文件被删除时,链接文件就无法使用
硬链接: 多个链接指向的是同一个文件,只有硬链接的个数变为0时,才会从磁盘上删除。

ln命令:
创建软链接: ln -s  源文件名  链接文件名
                    源目录名字  链接目录的名字
                    
如果链接文件的路径发生了变化,可能会导致之前的链接无法使用,除非链接是绝对路径。
比如: ln  -s /xxx/xxx/file(源文件的绝对路径)  link    
                
创建硬链接 : ln    原文件名   链接文件名
目录无法创建硬链接   

压缩命令:
 gzip:   gzip file   就是将file文件压缩为file.gz 
         源文件会消失
         
 gunzip: gzip的解压命令
         gunzip xxx.gz
         
 gzip -l  xxx.gz  查看文件压缩情况。
 
 
 bzip2: bz2的压缩命令
        bzip2  file   
        bunzip2  file.bz2   解压命令       

zip :压缩文件、目录
     压缩命令  zip -r  xxx.zip   dir  将目录dir压缩为xxx.zip    
     解压命令  unzip  xxxx.zip        
 
tar命令:
   归档:tar -cvf  1.tar  dir
         -c  创建归档文件
         -v   显示归档过程
         -f(归档名之前)   指定归档后的文件名
         
   归档并且压缩:         
         tar  -cjvf  1.tar.bz2   dir
          就是将dir目录归档压缩为bz2格式
         -j :指定压缩方式为bzip2 
         -z :指定压缩方式为 gzip
         
         -J :指定压缩方式为xz
         
    解压命令:    
     tar  -xvf xxx.tar.xx    解压压缩包
     tar -tf  xxx.tar  查看归档文件的组成
     tar -uf  xxx.tar  file   就是将file文件添加到xxx.tar的归档包中
     
less/more  分屏显示文件内容, 按q退出

grep :用来进行字符串查找
      grep -Rn  "字符串“  查找路径
       -R :递归查找
       -n: 显示字符串所在的文件的行号。
      grep 支持shell的通配符、正则表达式等。 

sort: 默认对文件内容进行升序排列
   sort file  -o  file  表示将排序后的内容写入到源文件    
   sort -r  file  按照降序排列    
   
   如果文件内容为字符‘0-9‘,会按照ascii比较   
   sort -n  file  排序时按照数值大小进行
   
uniq: 在终端上显示去除文件中相邻重复行后的内容
uniq -c  file : 表示统计文件中相邻重复的行数

diff: 比较文件的内容是否一致,会列出不一致的地方。
      如果文件内容一致,那么没有任何提示。

which:查找实用命令     
whereis: 查找命令或者程序 
who: 显示当前登录的用户名

find : 递归查找文件
   find  查找路径  -name   文件名(可以使用通配符)   /按照文件名查找
   find  查找路径  -perm    666     /按照文件权限查找
   find  查找路径  -group   组名    /按照文件分组查找

配合管道使用:  find  . | grep "查找关键字”

cut: 进行域的分隔
cut -d "xx"  -f xx, xxx
-d: 指定分隔符
-f: 指定要显示的域
比如:cut -d ":" -f 2,3     表示要显示以“:”作为分隔符的第2和第3个域的内容。

网络配置:相关文件 /etc/network/interfaces
                   /etc/resolv.conf
                   /etc/init.d/networking                    

 ipv4 ip地址类型: A B C D E
  ip地址组成: 网络id + 主机id
  子网掩码: A 255.0.0.0
             B  255.255.0.0
             C  255.255.255.0
             
ifconfig: 查看和配置网络的命令  

  通过ifconfig命令临时修改网络连接:
   ifconfig eth0  192.xxx.xxx.xx    修改eth0的ip地址    

虚拟机网络:
    1)共享主机网路
    2)独立于主机(桥接模式)    

  通过配置文件修改网络:见文件 


网络配置:
route 可以显示当前的路由表信息
ifconfig eth0  192.xxx.xxx.xx    修改eth0的ip地址    
route add default gw  192.168.1.1
route add netmask  255.255.255.0

netstat :用于网络查看,配置等。

ping: 用于测试网络连接。
ping   IP   测试本机和对应IP的连接状况。
ping -c 10  IP   
-c: 指定ping的次数

nslookup: 查看对应的域名的详细信息。
nslookup  www.baidu.com

shell编程:
shell脚本(是一系列命令的集合)

解释器: bash   sh

编写shell脚本的步骤:
1、
   #:  在shell中是注释的意思。
   #!/bin/bash  声明脚本使用的解释器   

2、脚本要执行必须要有执行权限:
 1) chmod  a+x  test.sh  
 2) bash   ./test.sh 

变量的定义和使用:
value=1  定义和赋值:注意”=“左右不能添加空格。
echo $value 使用: 注意需要跟上“$"符号,表示取值的意思。

用户自定义变量 :比如value

位置变量、预定义变量即命令行参数 :

$0   与键入的命令行一样,包含脚本文件名
$1,$2,……$9  分别包含第一个到第九个命令行参数, 如果超过9个参数,需要${10} ${11}

“$"符号本身输出需要进行转义。
 
$#   包含命令行参数的个数
$@  包含所有命令行参数:“$1,$2,……$9”
$?    包含前一个命令的退出状态
 退出状态: 0, 表示正常退出
            其他: 表示非正常退出。
            
$*    包含所有命令行参数:“$1,$2,……$9”
$$    包含正在执行进程的ID号

环境变量
比如 PATH  TERM   LD_LIBRARY_PATH   HOME(家目录)


read: 从终端上读入变量值。
read  value
read value1  value2  value3  ,那么多余的输入全部赋值给最后一个变量

可以进行连续调用:read  value1 
                  read  value2 

expr: 实现简单的整数运算。
加 +
减 -
乘 \*
除  /
取余  %

"``" :表示取该命令的执行结果, 比如: sum=`expr a + b `

test: 测试, 也可以使用 [] 来代替
测试数值大小
测试字符串是否一致  test  "hello" = "world" ,通过查看echo  $?的值判断是否一致。
 0表示为真, 非0表示为假
测试文件类型
测试退出状态

字符串的测试:

s1 = s2     测试两个字符串的内容是否完全一样
s1 != s2    测试两个字符串的内容是否有差异
-z s1     测试s1 字符串的长度是否为0
-n s1     测试s1 字符串的长度是否不为0

文件类型:
-d name     测试name 是否为一个目录
-f name     测试name 是否为普通文件
-L name        测试name 是否为符号链接
-r name     测试name 文件是否存在且为可读
-w name     测试name 文件是否存在且为可写
-x name     测试name 文件是否存在且为可执行
-s name     测试name 文件是否存在且其长度不为0
-e xxx      判断xxx是否存在
-a xxx        判断xxx是否存在
f1 -nt f2     测试文件f1 是否比文件f2 更新
f1 -ot f2     测试文件f1 是否比文件f2 更旧

数值大小:
a -eq b         测试a 与b 是否相等

a -ne b        测试a 与b 是否不相等

a -gt b         测试a 是否大于b    test  $a -gt 10 

a -ge b         测试a 是否大于等于b

a -lt b         测试a 是否小于b

a -le b         测试a 是否小于等于

结构性语句:
条件测试语句(两路分支)、多路分支语
句、循环语句、循环控制语句和后台执行语句等。

if结构:
if [ ]    ##在[]的左右必须添加空格
then
     条件为真时要执行的命令
fi

exit  数字  #####  退出,不同的数字代表退出状态。

问题:
从终端上读入分数 0-100
>= 90:  'A'
>= 80 : 'B'
>= 60 : 'C'
< 60 : 不及格

if中使用或运算: 
-o: 或运算符号
  if [ $score -lt 0  -o  $score -gt 100 ]    score < 0或者 score  > 100
  
-a: 与运算符
   if [ $score -ge 0  -a $score -le 100 ]    0=< score <= 100
   
   

if另一种结构:if then .. elif ...then fi
if []
then  
    xxxxxx
elif []    
then
    yyyyy
elif []
then
    zzzz
else
    xxx
fi    

多路分支语句case:    
case…esac 

case 变量  in
   10) xxxx
        ;;
   20) yyyyy
        ;;
   30)    zzzzz
        ;;
   *)  xxxxxx   ###默认情况是*
       ;;
esac       
    
case $num in
      9|10) ###满足9后者10
         echo "A"
        ;;  
esac        

循环语句:
for 循环:
for xxx
do
   要执行的命令
done

   for value  ####当从终端上读入参数可以
   do
       echo "value = $value"
   done
   
 for  xx  in  yyy
 do
    xxxxx
 done 
在列表中空格表示换行   
问题:
  传递一个文件名参数
  遍历当前目录下的文件名 ,如果找到和参数一致的,那么输出find,并且exit 退出
                            如果没有找到, 输入not find。。
   
问题:使用for循环遍历从命令行中传入的参数(数值),
      判断参数是否是偶数, 如果是,那么就输出。    
   
while循环:

while xxx
do
  要执行的命令
done

问题:使用while循环,在当前目录下创建file_1  到file_10  10个文件   

while true   ####代表死循环
do
done   
         
break n   跳出n层循环。
continue  

shell函数:

定义方式两种:
 function_name ( )  ####常用的定义方式
 {
            command1
            ……
            commandn
 }

 function   function_name ( )
 {
            command1
            ……
            commandn
 }

比如:
sum() ###括号是空的。
{
  sum=`expr $1 + $2` ###此处的 $1, $2不在是命令的位置参数
                        他们是调用该函数时传递的两个参数。
}

函数的两种调用方式
1、sum  10 20    ##直接调用函数sum,并且传递两个参数10和20, 不需要函数的返回值。

2、ret=`sum  10 20 `  ##调用函数sum,并且传递两个参数10和20, 需要接收函数的返回值并且赋值给ret变量。

函数中的return 不可以返回函数的执行结果,return只能返回函数的执行状态。
函数中要想返回结果,那么必须使用 echo  $value

问题:
 1、从终端上读入一个用户名
 2、在函数判断该用户是否处于登录状态
     如果是,就输出
     如果不是,就输出。
     

结构体:
结构体的构造:构造数据类型的定义。

struct Stu
{
   char name[32]; //结构体成员。
   int  age;//结构体成员。
   float score;  //结构体成员。 
};

构造类型变量的定义:  构造类型名    变量名字
                 比如: struct Stu    one;


问题:
1、 定义一个包含name,age ,score的学生信息结构体
2、实现学生信息的输入函数,从标准输入中输入每个学生的所有信息(学生有多少个,自己定义)
3、实现排序函数,通过学生信息的score来对学生进行排序
4、实现信息输出函数, 输出排序后的学生信息        

union: 定义共用体类型, 使用方法和结构体一样。
union Name
{
};     

存储类型:auto  register static extern
 int a;
 register int a;
static int a; a 就是静态变量,只会初始化一次。后续会保留上一次操作的值。 
static 修饰函数,表示该函数只能在当前文件中被调用。 
 
extern: 外部引用
extern 修饰函数表示,该函数是调用其他的文件的。
extern 修饰变量表示,该变量是引用其他文件的。


栈 stack:存放在栈上的数据,在函数调用完成之后,所占的栈空间都系统自动回收。
堆 heap :堆空间需要程序员手动申请, 当不需要时,那么需要手动释放空间。
         只申请空间,不释放:叫做内存泄露。
    
堆空间申请/动态内存申请:    
void * malloc(size_t num) 
参数num:就是要申请的字节个数。
返回值:返回申请到的空间的起始地址。
         出错,返回NULL,所以通常需要做出错判断。

void   free(void *p)
参数:申请到的空间的起始地址
free(p);
p = NULL; 避免double free。

释放堆空间时,不可以进行双重释放。

通过valgrind命令来检测 代码是否有内存泄露。
valgrind --tool=memcheck  ./a.out  打印使用堆空间信息。

gcc  test.c  -DDEBUG   
-D: 指定宏定义

Make: 工程管理器,编译源码
Make将只编译改动的代码文件,而不用完全编译
Makefile:是一个用来编译代码的文件。

Makefile按照规则来编译代码。
一条规则的基本构成如下:不要带有行末空格
 目标:依赖文件
 Tab键  编译命令
 
 变量的定义:
 var = 1
 $(var) 表示var的值
 用”$”则用”$$”来表示

 Makefile中的四种赋值:
 = 
 += 
 ?= 如果之前已经赋过值,那么不在赋值。
 := 直接展开和向后引用相反。
 
自动变量:
$<       第一个依赖文件的名称
$@  目标文件的完整名称
$^      所有不重复的目标依赖文件,以空格分开

默认第一目标为Makefile的终极目标

执行步骤:
make  默认执行当前目录下的Makefile文件
make clean 删除中间文件

make -f xxx   指定执行文件名为xxx的Makefile文件。

注释:使用 “#”

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值