Linux操作系统使用及C高级编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

文章目录

前言

一、linux shell 命令

1.基本命令

2.输出相关操作

1.1输出命令

2.2输入输出重定向

2.3通配符、管道

2.4历史查询、补全功能

2.5命令置换

二、使用步骤

1.引入库

2.读入数据

总结



前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

一、linux shell 命令

1.基本命令

man:手册
date:打印或设置系统日期和时间
ctrl + L和clear:清屏
-df:查看磁盘用了多少
 -a :列出所有文件系统~~删除线格式~~ 
 -k :列出磁盘的分配情况(KB)
 -h :同-k, 但大小以G、M,K单位显示
 -l :仅列出本地文件系统
-du:查看剩余空间
 -a :列出所有的对应目录及子目录所占大小 
 -h :列出磁盘的使用情况(KB) 
 -s :列出总的占用空间(KB)

2.输出相关操作

2.1输出命令

.echo:往终端上显示文本内容
     将字符串回显为标准输出
     -n不输出尾部换行符
     -e启用反斜杠转义的解释
     -E禁用反斜杠转义的解释(默认值)
注意 echo "$a" 和'$a'的区别,”“是打印a的值,‘’是打印$a
 

2.2输入输出重定向 

1.重定向: 

   输入/输出重定向是改变shell命令或者程序默认的标准输入/输出目标,重新定向到新的目标

2.默认的输入输出位置是哪里?

    linux中默认的标准输入定义为键盘,标准输出定义为终端窗口。

标准输入:(stdin,文件描述符为0):默认从键盘输入。

标准输出:(stdout,文件描述为1):默认输出到屏幕。

标准出错:(stderr,文件描述符为2):默认输出到屏幕。

3.为什么要使用重定向

a.当屏幕输出的信息很重要时,而且希望保存重要的信息时

b.后台执行中的程序,不希望它干扰屏幕正常的输出结果时

c.系统的例行命令,例如定时任务的执行结果,希望他可以存下来

d.一些执行命令,我们已经知道他可能出现错误信息,想把它直接丢掉时

e.执行一个命令,可能报错和正确的输出并序,类似错误日志与标准正确日志需要分别输出至不同的文件。

4.输出重定向

2.3通配符、管道

通配符是一种特殊语句,通配符是用来代替字符的        

管道

可以把一系列命令连接起来,意味着第一个命令的输出将作为第二个命令的输入,通过管道传递给第二个命令,第二个命令的输出又将作为第三个命令的输入,以此类推。就像通过使用“|”符连成了一个管道。 例如:cat file | wc -c:查找file文件里面有几个字符,显示在终端上。

2.4历史查询、补全功能

history:查询历史输入的命令

!c:上个以c开头的命令;

!g:上个以g开头的命令;可以用来敲gcc命令,比较方便

自动补齐:tab,可以敲一下也可以敲两下,一下是可以直接补齐的,两下是显示所有有可能的命令

2.5命令置换

3.文件处理相关命令

3.1查看文件相关命令

-cat:从前往后读

-tac:从后往前读

-more:一页显示不完的时候用more + 文件名可以按回车一直往下翻。但是不能往下往上

-less:和more一样但是可以往上往下翻动,用方向键上下就可以

-head:默认显示前十行

这些命令也都可以用vim来替代,看个人喜好

硬链接和软连接:Linux中的两种类型的链接

硬链接是利用Linux中为每个文件分配的物理编号—inode建立连接。因此,硬链接不能跨越文件系统。

软链接(符号链接)是利用文件的路径名建立链接。通常建立软链接使用绝对路径而不是相对路径,以最大限度增加可移植性。

-ln命令: ln  [ -s ]   target  link_name 选项“-s”表示为创建软链接。在缺省情况下,创建硬链接。参数target为目标文件,link_name为链接文件名。如果链接文件名已经存在但不是目录,将不做链接

linux@ubuntu:~$ ln  -s  /proc/cpuinfo   mycpuinfo

linux@ubuntu:~$ ls  –l  mycpuinfo

lrwxrwxrwx  1  wdl  wdl  13  2007-09-22 00:43  mycpuinfo -> /proc/cpuinfo

以上命令为/proc/cpuinfo文件创建了一个软链接文件。使用“ls –l”命令可以查看到新创建的链接文件所指向的目标文件名。

3.2文件搜索相关命令

-find命令

  -name '字串'  查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。

 -iname '字串' 忽略大小写的方式查找

  -type x   查找类型为 x 的文件   -exec 命令名称 {}  对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令。{}表示命令的参数即为所找到的文件;命令的末尾必须以“ \;”结束。

grep, egrep, fgrep, rgrep - print lines that match patterns 语法:grep [选项]  要查找的内容   查找的位置 常用选项:

-A    除了显示符合范本样式的那一列之外,并显示该行之后的内容。

-B    除了显示符合样式的那一行之外,并显示该行之前的内容。

-C    除了显示符合样式的那一行之外,并显示该行之前后的内容。

-i     忽略字符大小写的差别。

-r    查找位置是目录时用

-n  在显示符合样式的那一行之前,标示出该行的列数编号。

严格区分大小写,不过用-i可以忽略大小写

-grep - irn  "hello"     在目录下查找所有有hello字符串的文件

-which 查找命令存储的位置

3.3文件处理相关命令

-cut命令:取出字符

-b: 以字节为单位取出固定字符区间

 -c :以字符 的单位取出固定字符区间;

-d :后面接分隔字符。与 -f 一起使用;

 -f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;

-set命令:查看并且修改文件

-r:使用扩展正则表达式

-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项

-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改(使用最多)

-n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行

        a:  追加

        i:   插入

        d:  删除

        s:  替换

        p:  打印

-awk命令

'{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

3.4解压缩相关命令 

-gzip:压缩

-gunzip:解压缩

        将一个文件压缩成.gz格式的压缩文件,移植性好

         这个命令没有归档功能,每次只能压缩一个文件。生成相应名字的压缩包;且不能压缩目录 

-bzip和-bunzip2:bz2文件的压缩程序,压缩效率好点,不过也没什么区别

        bzip2命令是.bz2文件的压缩程序

        bzip2在性能上优于gzip,提供了最大限度的压缩比率。

-zip和-unzip命令

         压缩后的文件后缀名为 .zip,可以压缩目录,原文件保留。

         方便在Linux和微软Windows间交换文件

- tar命令主要用于将若干文件或目录合并为一个文件,以便备份和压缩。当然,之后出现tar程序的改进版本,可以实现在合并归档的同时进行压缩。用的最多

         tar命令符号模式的一般语法格式为:

        tar  [ -t | -x | -r | -c | -v | -f | -j | -z ]  tarfile  filelist

   -t    显示归档文件的内容  

   -x    释放归档文件

   -c    创建一个新的归档文件

    -r    追加的方式归档文件

    -v    显示归档和释放的过程信息

    -f    用户指定归档文件的文件名,否则使用默认名称

    -j    由tar生成归档,然后由bzip2压缩

    -z    由tar生成归档,然后由gzip压缩

4.进程管理、用户管理

4.1查看进程的命令

显示进程 (process) 的动态

语法:

                       ps [options]

常见的用法:     ps  -elf     ps  -aux

查看进程的命令-top:显示实时信息                                                                                                                                            

4.2发送信号命令:kill

使用kill命令终止进程

 kill  [-signal]  PID

      signal是信号

      PID是进程号

    kill 命令向指定的进程发出一个信号signal,在默认 情况下,kill 命令向指定进程发出信号15,正常情 下,将杀死那些不捕捉或不忽略这个信号的进程

4.3用户管理相关命令

二、shell脚本编程功能

   概述:Shell脚本是利用 shell 的功能所写的一个程序。这个程序是使用纯文本文件,将一些 shell 的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。

执行方式         1.bash test.sh        2. source  test.sh       3.  ./test.sh(要赋给文件最高权限 chmod 0777 文件名)

1.shell脚本变量 

 概述:

        变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。

        变量可以通过变量名访问。在指令式语言中,变量通常是可变的

变量的作用:

         用来存放系统和用户需要使用的特定参数(值)

         变量名:使用固定的名称,由系统预设或用户定义

         变量值:能够根据用户设置、系统环境的变化而变化

变量的命名要求:

        1.区分大小写  2.不能使用程序内的保留字和内置变量,例如if,佛如,  3.只能使用数字、字母以及下划线,且不能以数字开头。  4.使用英文尽量使词义通俗易懂。

变量的分类:

        1.自定义变量—由用户自己定义、修改和使用

                 a.用户自定义变量-取值

                        双引号: 允许通过$符号引用其他变量值;弱引用,其中的变量引用会被替换为变量值

                         单引号: 禁止引用其他变量值,$视为普通字符; 强引用,其中的变量引用不会被替换为变量值,而保持源字符串

                         反撇号: 命令替换,提取命令执行后的输出结果,``和$(…)作用相同

                b.用户自定义变量:数组

                       echo $a:默认显示数组a的第一个元素 #echo就是打印相当于printf  unset:删除

                        echo ${a[0]} :显示数组中第一个元素,以此类推

                        echo ${a[-1]}: 显示数组中最后一个元素

                        echo ${a[*]} 和echo ${a[@]} :显示数组中所有元素

                        echo ${#a[@]} :显示数组中元素的个数

                        echo ${a[@]:起始元素id:元素个数]} :显示数组中以起始元素为首的指定个数的元素(注意:这里起始元素id不能为负值

unset a[n] 删除数组中的第n个元素

unset a 删除a这个数组

#!/bin/bash 
#变量

COUNT=3
echo $COUNT
#""和‘’
echo "$COUNT"
echo 'COUNT'

#A=echo $COUNT #不能这样赋值
A=`echo COUNT` #赋值要用``反撇号
A=$(echo $COUNT) #这样赋值也可以
echo $A

#array数组
a=(1 2 3 4 5)
echo $a #默认是数组第一个元素
echo ${a[*]} #*和@符号都是去全部的数组元素
echo ${a[@]}

echo ${#a[*]} #打印数组有几个元素
echo ${#a[@]}
#取其中某一个元素
echo ${a[2]}
unset a[2]
echo ${a[*]}
echo ${a[@]:1:2} #打印数组里从第一元素开始到第2个元素结束


#unset 
#echo $COUNT

        2.特殊变量:

                a.环境变量:由系统维护,用于设置工作环境

                        常用环境变量

                        $USER 表示用户名称

                        $HOME 表示用户的宿主目录

                        $LANG 表示语言和字符集

                        $PWD 表示当前所在工作目录

                        $PATH 表示可执行用户程序的默认路径  

                        export可以将变量指定为全局变量

                b.只读变量:用于变量值不被允许被修改的情况

                        变量值不允许修改(重新赋值)的情况

                        无法使用 unset删除

                        最快方法重启

                         readonly

                c.位置变量:通过命令行给脚本程序传递参数

                                $0 与键入的命令行一样,包含脚本文件名

                                $1,$2,...$9 ${10}分别包含第一个到第十个命令行参数

                                $# 包含命令行参数的个数

                                $*  包含所有命令行参数,是一个整体: "$1,$2,...$9"

                                $? 包含前一个命令的退出状态

                                $$ 包含正在执行进程的ID号

                                        注意:运行的时候就要把值输出来:./test.sh 3 9 d d

                d.预定义变量:bash中内置的一类变量,不能直接修改

2.shell语句

2.1.1.shell程序

        Shell 程序由零或多条shell语句构成。 shell语句包括三类:  说明性语句  功能性语句  结构性语句。

2.1.2 说明性语句

2.1.3.功能性语句

read从标准输入读入一行, 并赋值给后面的变量,其语法为:

       read  var    

 把读入的数据全部赋给var    

   read  var1  var2  var3

     把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量.

如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。

#!/bin/bash 

#-s 输入不回显示
#-t 指定输入的时间
#-p 制定输入的提示字符串“please input two num:”就是这个
read -s -t 3 -p "please input two num: " val1 val2
echo $val

#read val2
echo $val2

算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如:

  $ expr  12  +  5  \*  3

  27

  $ expr  3  -  8  /  2

  -1

  $ num=9   $ sum=`expr  $num  \*  6 `

  $ echo  $sum

  54

#!/bin/bash 

read -p "please input two num: " val1 val2


echo "val1 = $val1"
echo "val2 = $val2"

temp=`expr $val1 + $val2`
echo $temp

temp=`expr $val1 \* $val2`
echo $temp

temp=`expr $val1 - $val2`
echo $temp

temp=`expr $val1 / $val2`
echo $temp

 test语句可测试三种对象: 字符串     整数     文件属性( 每种测试对象都有若干测试操作符)

  字符串测试

s1 = s2       测试两个字符串的内容是否完全一样

s1 != s2      测试两个字符串的内容是否有差异

-z s1           测试s1 字符串的长度是否为0

-n s1           测试s1 字符串的长度是否不为0

#!/bin/bash 

#测试字符串
val1="hello"
val2="hello"

test "$val1" = "$val2"
echo $? #测试字符串是否相等

val1=
test -z "$val1"
echo $?

val1="ew"
test -n "$val1"
echo $?

  整数测试

a -eq b     测试a 与b 是否相等

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

a -gt b      测试a 是否大于b

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

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

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

#!/bin/bash 


#整数测试
val1=5
val2=9
test $val1 -ne $val2
echo $?

test $val1 -eq $val2
echo $?

test $val1 -gt $val2
echo $?

test $val1 -lt $val2
echo $?

test $val1 -le $val2
echo $?

#命令返回值为真(0),否则返回值为假(非0).

  文件测试

-e name    测试一个文件是否存在

-d name    测试name 是否为一个目录

-f name     测试name 是否为普通文件

-L name    测试name 是否为符号链接

-r name     测试name 文件是否存在且为可读

-w name   测试name 文件是否存在且为可写

-x name    测试name 文件是否存在且为可执行

-s name    测试name 文件是否存在且其长度不为0

f1 -nt f2    测试文件f1 是否比文件f2 更新

f1 -ot f2    测试文件f1 是否比文件f2 更旧

2.1.4.结构性语句

结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。

主要包括: 条件测试语句(两路分支)

多路分支语句

循环语句

循环控制语句等

3.shell分支语句

3.1分支语句和多路分支语句 

 语法结构:

         if    表达式  

               then  命令表          

         fi

    如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。 if和fi是条件语句的语句括号, 必须成对使用; 命令表中的命令可以是一条, 也可以是若干条。      

#!/bin/bash 

read -p "input a filename:" file

#test -e $fil
#echo $?

#if test -e $file
if [ -e $file ]
then 
	echo "$file exit"

fi
#!/bin/bash

#if -else

read -p "input a filename" file

if [ -f $file ]
then
    echo "$file is a file"
elif [ -d $file ]
then
    echo "$file is a dir"
fi

 if elif 语句

#!/bin/bash 

read -p "input a filename: " file

if [ -f $file ]
then
	echo "$file is a file"
elif [ -d $file ]
then
	echo "$file is a dir"

fi

3.2shell循环分支语句

#!/bin/bash

#学生成绩分级管理
#80-100 A
#60-79  B
#0-59   C

read -p "input score: " val
#要求输入的范围是0-100
#-o  或
#-a  与
#!  非
#if [ $val -gt 100 -o $val -lt 0 ]
if [ $val -gt 100 ] || [ $val -lt 0 ]
then
	echo "input error val"
	exit
fi

val=`expr $val / 10`

case $val in
	8 | 9 | 10)
		echo "A"
		;;
	6 | 7)
		echo "B"
		;;
	*)
		echo "C"
		;;   #;;只有最后一个模式可以省略,前面不可以
esac

三、结构体

3.结构体嵌套

#include <stdio.h>

struct person
{
    char name[16];
    int age;
    char sex;
};

struct student
{
    struct person stu;
    float score;
};

struct teacher
{
    struct person tea;
    char phone[12];
};

int main()
{
    struct student s;
    
    strcpy (s.student.name, "zhangwei");
    s.student.age = 12; //多少层嵌套就是多少个.
    s.student.sex = 'm';
    s.score = 98;
    printf("namde=%s, age=%d, sex=%c, score=%f\n", s.stu.namde, s.stu.age, s.stu.sex, s.score);
    return 0;
}

结构体大小

所谓结构体字节对齐就是  有效对齐=自然和默认中小的那个,然后地址的首个数字必须要能被有效字节数整除。

位域

        位于就是把一个字节中的二进制位分为几个不同的区域,并说明每个位域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就是可以把几个不同的对象用一个字节的二进制位域来表示

    一个字节=8个bit位。一个0就是一个bit位

1.所谓位于就是先把变量的地址给他安装我们自己的意思分好,8个bit,随便分但是不能超过8

例子:unsigned char a:2   相当于a分8个bit里面的2个

           unsigned char b:3              b分8个bit里面的3个

           unsigned char c:3              c分8个bit里面的3个        

加起来正好8

 2.分号地址后再去赋值,赋值有3种方式:

struct A t;//1.先定义变量再赋值
t.a = 1; 
t.2 = 3; 
t.3 = 5;

struct A t1 = {2, 4, 3};//2.定义变量同时赋值

//3.定义位是就赋值
struct A
{
    unsigned char a:2
    unsigned char b:3
    unsigned char c:3
};t2 = {2, 4, 3};

 4.C语言共用体和枚举

4.1 共用体

在定义说明和使用形式与结构体一样,就是内存的使用方式不同(使用时就可省去一个结构体的空间)

        在c语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用体,简称共用,又称联合体

定义:语法 

 union 公用体名字(自己定)

{

共用体成员列表

}

注意:共用体一次只能访问一个变量,因为是公用的,打印的值是一样的

#include <stdio.h>

struct person
{
    char name[16];
    int age;
    char sex;
    char phone[12];
};

union un
{
    int num;
    char ch;
    struct person student;
    struct person teacher;//union中这四个在访问时只能访问一个,不能同时访问多个
};

int main()
{
    union un u;
    u.nmu = 67;
    printf("%d\n", n.num);

    return 0;
}
#include <stdio.h>
struct person
{
    char name[16];
    int aeg;
    char sex;
    char phone;
};

union un
{
    int num;
    char ch;
    struct person student;
    struct person teacher;
    //3.定义共用体时定义变量并赋值
}u2 = {69};

int main()
{
    union un u;   //1.定义完共用体变量在赋值
    u.num = 67;
    printf("num = %d, ch = %c\n", u.num, u.ch);
    
    //2.定义共用体变量时赋值
    union un u1 = {
        .student.name = "zhangsan",
        .student.age = 18,  //这里用逗号
    };
    printf("num = %d, ch = %c\n", u1.num, u1.ch);
    printf("name = %s, ago = %d\n", u1.student.name, u1.student.age);
    printf("num = %d, ch = %c\n",u2.num,u2.ch);

共用体大小:1.看齐,2.必须能整除

4.2枚举

c语言中构造类型之一

在开发中,有些变量只有几种可能的取值,比如:一周有七天、一天有四季、在枚举的定义中,会将变量一一列举出。

定义  语法

enum 枚举名

{

        枚举成员列表   成员之间用逗号隔开

};

4.3type关键字 

语法:

        typedef  <已有数据类型> <新数据类型> //改名、简

#include <stdio.h>

struct person
{
	char name[16];
	int age;
	char sex;
};

typedef struct person p;
typedef union un
{
	int num;
	char ch;
	p stu;
	p tea;
}a,*a_p;

int main()
{
	a u;
	a_p p;
	p = &u;
	u.num = 67;
	printf("%d\n", p->num);

	union un u1 = {
	.stu.name = "zhangsan",
	.stu.age = 18,
	};

	printf ("name=%s, age=%d\n", u1.stu.name, u1.stu.age);

	return 0;
	}

四、内存

1.内存管理

内存分区

代码区:存放在函数体的二进制代码,由操作系统进行管理(cpu执行的机器指令,共享只读)

全局区:(全局静态区):存放全局变量和静态变量以及常量(包含 const)

栈区:由编译器自动分配释放,存放函数的参数值,局部变量等(随函数的存在而存在)

堆区:由程序员分配和释放,若程序员不释放程序时由操作系统回收(最好不要让操作系统回收)

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值