7天Linux基础语法

本文介绍了Linux系统的基础知识,包括与Windows的对比、文件系统结构、常用shell命令以及vim编辑器的使用。还涉及gcc编译工具、程序执行、文件管理、网络配置、用户管理和shell脚本编写等内容,是Linux初学者入门教程。
摘要由CSDN通过智能技术生成

day1

一、linux系统基础

 1、linux和windows

​    linux:开源、免费、安全性高、稳定性强、可移植性高

 2、linux操作系统的基本使用

 3、linux的文件的系统结构

​   windows:所有文件有分盘(C,D,E,F....),每个盘中都有子文件或者子目录,对文件存放没有要求,可以放在任意位置

​   linux:没有分盘,只有一个大的目录--根目录('/'),根目录下的文件夹每一个都有其固定作用

​            bin:存放二进制文件或者可执行程序

​            dev:存放设备文件

​            etc:系统相关的配置文件

​            home:用户目录,用户所有操作都在该目录下进行  可以用符号(~)表示

1、基本的shell命令

​        shell本质:命令行解释器,将用户输入的特定指令转换为系统能够识别的语言

    绝对路径:从根目录出发所表示的一个路径
    相对路径:相对于用户当前位置所表示的一个路径

pwd:显示当前用户在文件系统中的绝对路径
    用法:
        pwd + 回车
ls:显示当前用户所在路径下的所有文件(不包含隐藏文件)
    用法:
        ls + 回车
ls -a:显示当前用户所在路径下的所有文件(包含隐藏文件)
    '.' == 用户当前目录
    '..' == 当前目录的上一级目录
    
ls -l:显示当前用户所在路径下的所有文件的详细信息
    - rw- rw- r--
    第一位代表文件类型:
        '-' :普通文件
        'd' :目录文件
        'c' :字符设备文件
        'b' :块设备文件
        'p' :管道文件
        'l' :符号链接文件
        's' :套接字文件
            不同操作系统下支持使用的文件类型不同
        
    后9位代表文件存取权限
         rw-rw-r--  == 110 110 100 == 0664
         权限的前3位表示用户自己的使用权限,如果当前位上没有对应权限用'-'表示                      
         权限的中间3位代表用户组的使用权限        
         权限的最后3位代表其他用户的使用权限
            r -- 具有读权限  w -- 具有写权限  x -- 具有可执行权限

cd: 目录跳转    
    用法:
        cd + 指定路径    

touch:以不打开的方式创建一个文件,如果文件存在,则修改时间戳
    用法:
        touch + 文件名
    
rm:删除指定文件
    用法:
        rm + 文件名
    
cat:显示文件内容
    用法:
        cat + 文件名
    
cp: 复制文件
    用法:
        cp + 源文件名 + 路径名
        cp + 源文件名 + 目标文件名
mv:移动文件
    用法:
        mv + 源文件名 + 路径名
        mv + 源文件名 + 目标文件名    

mkdir: 创建目录
    用法:
        mkdir + 目录名
    
rmdir: 删除指定目录(空目录)   
    用法:
        rmdir + 目录名
    
      删除非空目录:rm -r 目录名
   

clear:清屏    ctrl + l快捷方式也可以清屏
Tab: 命令补全

2、vim编辑器

shell命令:vi 或者 vim + 文件名

如果文件不存在,则会先创建再进行编辑

vim编辑器中的三种工作模式:

命令行模式:用户在进入编辑器后默认处于的工作模式

在命令行模式下不能直接输入数据,但是可以对文本进行复制、粘贴、剪切、撤销等操作:

在命令行模式下输入:

nyy:将光标以及光标以下的n行数据进行复制

ndd:将光标以及光标以下的n行数据进行剪切

p:将复制或者剪切的内容粘贴到光标的下一行

u:撤回到上一步操作

编辑模式:可以对文本进行编辑操作

在命令行模式下输入:a, i, o都可以进入编辑模式

按Esc退回到命令行模式

底行模式:对文本进行保存、退出等操作

在命令行模式下输入冒号进入底行模式

在底行模式下输入:

w:保存文件

q:退出文件

wq:保存并且退出

q!:强制不保存退出

x:保存并且退出

3、gcc编译工具

shell指令:

gcc + c文件名

编译成功之后会在当前目录下产生一个名为a.out的二进制可执行程序

gcc c文件名 -o 新的二进制可执行文件名

4、执行程序

shell命令:

./可执行的二进制文件名

### chmod--修改文件权限

1、chmod u+x 文件名----给当前用户增加执行权限

如果不加u,默认给所有用户加权限

u--用户自己

g---用户组

o---其他用户

2、chmod 0777 文件名

### 链接文件--ln

硬链接:

ln 文件名 硬链接文件名

硬链接如果把本体文件删掉,依旧可以单独使用,类型和原文件一模一样,移动原文件也依旧可以执行

ln -s 文件名 软链接文件名 

大大缩小了文件的大小,如果把本体文件删除或者移动,软链接失效

### 文件的压缩与解压

gzip---压缩文件,原文件被替换成压缩之后的文件,,会生成一个.gz的压缩文件,用vi能看到源文件内容,用cat在终端查看乱码

gunzip---解压文件

bzip2---压缩文件,原文件被替换成压缩之后的文件,,会生成一个.bz2的压缩文件,压缩功能相对于gzip较弱,但是压缩时间缩短

bunzip--解压文件

xz---压缩文件,原文件被替换成压缩之后的文件,,会生成一个.xz的压缩文件,压缩功能相对于gzip较弱,但是压缩时间缩短

unxz--解压文件

day2

## tar-归档和释放

```c
tar
-c   创建归档文件
-v   显示归档或释放过程
-x   释放归档文件
-f   用户指定归档文件的文件名,否则使用默认名称
-j   以bzip2方式压缩
-z   以gzip方式压缩
    tar -czvf  要压缩或归档之后的文件名 目标文件名
    tar -xvf  要释放之后的文件名 目标文件名
```

![image-20230314201010033](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20230314201010033.png)

tar -zcvf 10.gz 1.c 2.c

![image-20230314201312619](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20230314201312619.png)

tar -zcvf  区的名字 压缩文件名1 压缩文件名2

## diff

```c
比较文件的不同

```

## grep--查询

```c
grep  查询的字符串 查询文件名---查询特定文件的内容
grep  -r 查询的字符串 路径----查询一个路径下所有文件的内容
```

## wc

```c
wc 文件名: 行数 单词个数 单个字符个数 文件名
-l:只查看行数
 -w:只查看单词个数(看空格)
 -c:只查看单个字符个数
```

# 工具:

vi编辑器

gedit编辑器

gcc编译器

## 下载工具:

deb(常用的) ----Debian

rpm(小红帽)----Redhat

### dpkg工具----离线下载,没有依赖文件

sudo----暂时赋予用户权限,密码初始都为1,但是不显示密码的输入,确保输出按回车就可以了

dpkg都要加sudo

sudo dpkg -i 安装包---下载

sudo dpkg -r 软件名---卸载

### apt工具---在线下载

下载:

sudo apt-get install sl--跑火车

sudo apt-get install frozen-bubble--泡泡龙

sudo apt-get install cmatrix--代码雨

sudo  apt-get install fortune----名人名言

sudo  apt-get install fortunes-zh----名人名言(中文)

sudo  apt-get install lolcat----有颜色显示

fortune | lolcat

卸载:sudo apt-get remove 软件名

### 创建共享文件夹:

1、选择虚拟机左上菜单的虚拟机选项,点击设置

2、点击选项,找到共享文件夹,选择总是启用

3、点击添加,跟着下一步,选择主机(windows)的一个文件作为自己的共享文件夹

4.点击完成,点击确定,最后在/mnt/hgfs查看有没有

### 网络配置:

ping--能不能网络通信

ping +IP地址

1、点击虚拟机菜单的编辑,选择虚拟网络编辑器

2、点击更改设置(如果没有,直接选择桥接模式)

,选择桥接模式

3、在桥接模式下选择自己windos网络的描述名字,点击确定

4、点击虚拟机,选择设置,找到网络适配器,选择自定义模式,选择自己的网络名称(一般为VMnet0),点击确定

5、进入linux系统,断开重连网络(重启网络)

或者:在终端上输入:

sudo service network-manager restart

### ifconfig---查看linux系统的IP地址

ipconfig---查看windows系统的IP地址

## 用户管理

超级用户:su,开通了所有权限,我们一般不在这里工作,因为一旦删除,找不回来,也容易操作到内核上的东西

exit:退出超级用户

查看用户---vi /etc/passwd

查看用户组--vi /etc/group

添加用户:

adduser 新添用户名

输入密码,不显示,确保输入按回车

su 用户名----进入该用户

删除用户---deluser 用户名,但是我们一般进入passwd和group这两个文件去删除(加sudo)

修改密码:passwd

exit:退出

ps   查看前台的进程

ps -aux  查看所有进程

pstree---以树的形式展示进程

top---查看进程(从占用cpu最大开始展示),类似于任务管理器

kill -9 进程号   ----杀死进程

## shell的特殊字符

|---管道

指令1| 指令2----把指令1的输出作为指令2的输入

fortune | lolcat

```c
` `---命令置换
指令1 `  `    把命令置换里面的内容作为指令1的参数
    echo `ls`
```

echo--终端的输出

echo hello    world---会自动缩进空格字符串之间保留一个空格

echo ’hello    world‘---原样输出

echo ”hello    world“---原样输出

输入输出重定向

```c
>:
cat >1.c
覆盖输入
 >>:
追加输入
cat >>1.c
```

通配符:

*---匹配所有字符串

{起始..结束}--可以创建起始到结束的文件

touch {1..10}.c

【】

rm 【13579】.c----删除了1.c 3.c 5.c 7.c 9.c

rm [1-5].c----删除了1.c2.c3.c4.c5.c

```c
rm [^8].c  删除除了8.c的文件,也只能通配一个
```

?---匹配一个字符串

rm h?llo.c---删除hello.c hrllo.c

shutdown---关机

shutdown -r now---重启

快照--相当于备份

## shell脚本:

本质:shell命令的有序集合

解释型语言(python,shell脚本)

不会检查错误,但是会显示出错误,出现错误会继续执行后面的语句

需要一个解释器

编译型语言(c语言,c++)

编译会报错,一旦错误会停止进程

怎么去写一个shell脚本:

1、创建一个.sh的文件(也可以没有后缀名)

2、写shell命令

3.执行:

a、通过bash这个解释器来执行,直接bash+要执行的文件

b、通过chmod给shell文件添加执行权限,然后再执行

第一行一般写:#!/bin/bash,我们解释器的路径

练习:复制上一级目录的1.c 2.c到当前目录下,然后把hello world写入1.c

```c
1 #!/bin/bash
  2 
  3 cd ../
  4 touch 1.c 2.c
  5 cp [12].c day2
  6 echo "hello world" >day2/1.c

```

### shell变量

#### 自定义变量

没有数据类型,默认为字符串类型

赋值不能隔开

变量名=值

没有分号,换行就相当于分号

变量的调用需要加钱$

```c
1 #!/bin/bash
  2 
  3 a=12
  4 echo $a

```

#### 位置变量

命令行参数的变量

从终端传递参数给shell脚本

```c#
从$0开始到$9如果要打印9以后的变量需要加{},例如${12}
```

#### 环境变量

计算机定义好了的变量

env可以查看所有环境变量

调用需要加$

#### 预定义变量

计算机给一些特殊变量赋予特殊意义

$*--打印的是命令行参数的所有变量,不包括$0
    $@--打印的是命令行参数的所有变量,不包括$0
    $#--打印的是命令行参数的个数,不包括$0
    $?--打印上一次的返回状态(0代表真,1代表假)

day3

tar

diff

grep

wc

工具:vi、gedit、gcc、bash、dpkg、apt、网络配置、共享文件夹

用户管理:adduser、deluser、/etc/passwd、/etc/group、su、exit、passwd

sudo

进程管理:ps、ps -aux、pstree、top、kill -9 进程号

shell的特殊字符:| `` >>通配符:*、{..}、【】、【-】、【^】、?

shell脚本:

shell变量:

自定义变量

位置变量

环境变量

预定义变量

作业:

  9 int main(int argc, char *argv[])
 10 {
 11     int arr[10]={1,2,3,4,5,6,7,8,9,10};
 12     int temp,i,m;
 13     printf("please input a number:\n");
 14     scanf("%d",&m);
 15     m=m%10;
 16     while(m--)
 17     {
 18         temp=arr[9];
 19         for(i=9;i>0;i--)
 20         {
 21             arr[i]=arr[i-1];
 22         }
 23         arr[0]=temp;
 24     }
 25     for(i=0;i<10;i++)
 26     {
 27         printf("%d ",arr[i]);
 28     }
 29     puts("");
 30 
 31 
 32     return 0;
​

变量的四则运算:

1、(())

不能进行浮点型的运算

调用的时候需要加钱$

可以进型幂数运算

可以进行自加自减

 #!/bin/bash
  2 
  3 a=$(( 3**3))
  4 echo $a
​

2、【】

不能进行浮点型的运算

调用的时候需要加钱$

可以进型幂数运算

  1 #!/bin/bash
  2 
  3 a=$[ 3+3]
  4 echo $a
​

3、expr

需要命令置换符置换出来结果``

算数之间需要空开

当进行乘法的时候需要用\区分

没有幂数运算

1 #!/bin/bash
  2 
  3 a=`expr 1 \* 2`
  4 echo $a
​

练习:运算出a=3的3次方的值,b=5*7的值,交换

1 #!/bin/bash
  2 
  3 a=$((3**3))
  4 b=`expr 5 \* $((4+2))`
  5 c=$a
  6 a=$b
  7 b=$c
  8 echo a=${a}b=$b
​

shell 语句

解释性语句

#注释一行

注释多行

:<<!

注释的shell语句

:<<EOF

注释的shell语句

EOF

功能性语句

test

字符串 整型 文件

字符串的比较

test 字符串1 = 字符串2 ----比较两个字符串是否相等

test 字符串1 != 字符串2 ----比较两个字符串是否不相等

test -z 字符串---判断字符串为不为空

test -n 字符串---判断字符串是否不为空

1 #!/bin/bash
  2 
  3 a="hello"
  4 b="hello"
  5 test $a != $b
  6 test -z $a
  7 test -n $a
  8 echo $?
​
​

整型的比较

-eq---等于

-ne---不等于

-gt---大于

-lt--小于

-ge---大于等于

-le---小于等于

文件的比较

-e ---判断文件是否存在

-f---判断文件是否是普通文件

-L---判断文件是否是链接文件

-S---判断文件是否是套接字文件

-b---判断文件是否是块文件

-c---判断文件是否是字符文件

-d---判断文件是否是目录文件

-p---判断文件是否为管道文件

文件的权限:

-r--判断文件是否有可读权限

-w---判断文件是否有可写权限

-x---判断文件是否有可执行权限

文件1 -nt 文件2--判断文件1是否比文件2新(时间戳)

文件1 -ot 文件2--判断文件1是否比文件2旧(时间戳)

-o---或

-a---与

1 #!/bin/bash
  2 
  3 test -d $1 -a -f $2
  4 echo $?
~           
​

read

把终端上的输入传给参数

read 变量1 变量2

read -p 提示 变量名

1 #!/bin/bash
  2 
  3 read -p "please input tow numbern:" a b
  4 echo $a
  5 echo $b
​

read -t 时间 变量名---限制时间输入

超过时间会自动结束(以秒为单位)

1 #!/bin/bash
  2 
  3 read -t 5 a b
  4 echo $a
  5 echo $b
​

read -n --限制输入的个数,超过个数也会自动结束

 1 #!/bin/bash
  2 
  3 read -n 1 a b
  4 echo $a
  5 echo $b
~           

read -s ---隐藏输入

控制语句

if

第一种:

if【】

then

shell语句;

fi

注意:if和【】之间要隔一个空,表达式和【】也要隔一个空

1 #!/bin/bash
  2 
  3 a=56
  4 b=34
  5 if [ $a -gt $b ]
  6 then
  7     echo "hello world"
  8 fi
​

第二种:

if test语句

then

shell语句;

fi

  1 #!/bin/bash
  2 
  3 a=56
  4 b=34
  5 if test $a -gt $b
  6 then
  7     echo "hello world"
  8 fi
​

if - elif-else

1 #!/bin/bash
  2 
  3 read a b
  4 if test $a -gt $b
  5 then
  6     echo "hello world"
  7 elif test $a -eq $b
  8 then
  9     echo "zhangcheng"
 10 else
 11     echo "day3"
 12 fi
​

练习:输入一个文件名。判断这个文件是否存在,如果不存在,就创建,判断是否有可写权限,如果有,就把helloworld 写进去,如果没有,赋予可写权限,再写进去,如果存在就写入helloworld

  1 #!/bin/bash
  2 
  3 read -p "please input a filename:" file
  4 if test -e $file
  5 then
  6     if test -w $file
  7     then
  8        echo "hello world">>$file
  9    else
 10        chmod +w $file
 11        echo "hello world">>$file
 12     fi
 13 else
 14     touch $file
 15     echo "hello world">>$file
 16 fi
​

case 表达式 in

表达式)

shell语句

;;

表达式)

shell语句

;;

esac

  3 read a
  4 case  $a in
  5     1|2|3)
  6         echo "星期一"
  7         ;;
  8     2)
  9         echo "星期二"
 10         ;;
 11     3)
 12         echo "星期三"
 13         ;;
 14     4)
 15         echo "星期四"
 16         ;;
 17     5)
 18         echo "星期五"
 19         ;;
 20     6)
 21         echo "星期六"
 22         ;;
 23     7)
 24         echo "星期天"
 25         ;;
        *)
 27         echo "asdads"
​
 26 esac

用【】

read a
  4 case  $a in
  5     [a-zA-Z])
  6         echo "星期一"
  7         ;;
  8     [zbc])
  9         echo "星期二"
 10         ;;
​
​

练习:模拟一个应用下载

  1 #!/bin/bash
  2 
  3 read -p "请选择要下载的应用:" app
  4 read -p "请确认是否下载y|n|q)" chioce
  5 case $chioce in
  6     Y|y|yes)
  7         echo "$app正在下载中....."
  8         ;;
  9     N|n|no)
 10         echo "取消下载$app"
 11         ;;
 12     *)
 13         echo "退出"
 14 esac
 15 
​

循环语句

while 表达式

do

shell语句

done

1 #!/bin/bash
  2 
  3 a=5
  4 while test $a -gt 0
  5 do
  6     ((a--))
  7     echo $a
  8 done

死循环

while true

do

shell语句

done

for

for((表达式1;表达式2;表达式3))

do

shell语句

done

1 #!/bin/bash
  2 
  3 
  4 i=5
  5 for((i=0;i<5;i++))
  6 do
  7     echo $i
  8 done
​

for 变量 in 单词表

do

shell语句

done

1 #!/bin/bash
  2 
  3 
  4 i=5
  5 for i in he li oi asda adsa ada ad
  6 do
  7     echo $i
  8 done
​

连续的

for 变量 in {起始..结束}

 1 #!/bin/bash
  2 
  3 
  4 i=5
  5 for i in {a..z}
  6 do
  7     echo $i
  8 done
​

for 变量 in ``

 1 #!/bin/bash
  2 
  3 
  4 i=5
  5 for i in `ls`
  6 do
  7     echo $i
  8 done
​

练习:求1到100的和

 1 #!/bin/bash
  2 
  3 sum=0
  4 i=5
  5 for((i=0;i<101;i++))
  6 do
  7     sum=$(($sum+$i))
  8 done
  9 echo "sum=$sum"
 1 #!/bin/bash
  2 
  3 sum=0
  4 i=5
  5 for((i=0;i<101;i++))
  6 do
  7     sum=`expr $sum + $i`
  8 done
  9 echo "sum=$sum"
​

shell数组

shell脚本里面只有一维数组

没有数据类型

数组的初始化

数组名=(元素1 元素2 元素3.。。。)

数组的赋值:

数组名【下标】=内容

数组的调用:

${数组名【下标】}

数组的遍历:

循环遍历

${arr[*]}

${arr[@]}

求数组的长度:${#arr[*]}

 1 #!/bin/bash
  2 
  3 arr=(hello world nihao shijie)
  4 arr[0]="zhangcheng"
  5 echo ${arr[0]}
  6 echo ${arr[@]}
  7 echo ${#arr[*]}
~                      

练习:

数组的逆序打印(用交换)

shijie nihao world hello

1 #!/bin/bash
  2 
  3 arr=(hello world nihao shijie)
  4 arr[0]="zhangcheng"
  5 echo ${arr[0]}
  6 echo ${arr[@]}
  7 len=${#arr[*]}
  8 for((i=0;i<$len/2;i++))
  9 do
 10     temp=${arr[$i]}
 11     arr[$i]=${arr[$(($len-$i-1))]}
 12     arr[$(($len-$i-1))]=$temp
 13 done
 14 
 15 echo ${arr[@]}
​

shell函数

没有数据类型

没有写形参,但可以传参

只有调用函数之后,函数里面的变量才会生效

函数里面定义的都是全局变量,如果要定义局部变量,加local

函数的一般形式:

function 函数名()

{

函数体

}

函数名()

{

函数体

}

函数的调用,直接函数名

返回值return,可以通过$?来打印函数的返回值,如果有返回值,返回在0~256

 1 #!/bin/bash
  2 
  3 add()
  4 {
  5     a=12
  6     return $a
  7 }
  8 add
  9 echo $?
​

函数的传参

函数名 实参1 实参2.。。。

函数体中用$1,$2$3.....来接受传递的实参
1 #!/bin/bash
  2 
  3 add()
  4 {
  5     a=12
  6     echo $1
  7     echo $2
  8     echo $3
  9     return $a
 10 }
 11 add 34 56 78
 12 echo $?

练习:写一个求和函数

 1 #!/bin/bash
  2 read m n
  3 add()
  4 {
  5     sum=0
  6     for((i=$1;i<=$2;i++))
  7     do
  8         sum=$(($sum+$i))
  9     done
 10 }
 11 add m n
 12 echo $sum

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值