Linux命令入门教程

Linux入门教程

ls 命令

  • ls -l 显示当前目录下的文件夹及文件的详细信息(drwxr-xr-x d开头的是文件夹,-rwxr-xr-x -开头的是文件)

    ericdai@ericdai-virtual-machine:~$ ls -l
    total 36
    drwxr-xr-x 2 ericdai ericdai 4096 8月  19 22:51 Desktop
    drwxr-xr-x 2 ericdai ericdai 4096 8月  19 22:51 Documents
    drwxr-xr-x 2 ericdai ericdai 4096 8月  19 22:51 Downloads
    drwxr-xr-x 2 ericdai ericdai 4096 8月  19 22:51 Music
    drwxr-xr-x 2 ericdai ericdai 4096 8月  19 22:51 Pictures
    drwxr-xr-x 2 ericdai ericdai 4096 8月  19 22:51 Public
    drwxr-xr-x 3 ericdai ericdai 4096 8月  19 22:53 snap
    drwxr-xr-x 2 ericdai ericdai 4096 8月  19 22:51 Templates
    drwxr-xr-x 2 ericdai ericdai 4096 8月  19 22:51 Videos
    

    4096 是文件或文件夹的大小;8月 19 22:51 文件或文件夹的创建时间。

  • ls 显示当前目录下的文件夹名及文件名(若存在),不显示其它信息。

clear 命令

  • clear 清空当前终端窗口的内容

cd 命令

  • cd .. 往前退一个目录路径(进入上层文件目录)

操作文件夹命令

  • mkdir tutorial/ 在当前目录下创建文件夹 tutorial,/可有可无。

  • rmdir tutorial/ 删除当前目录下的 tutorial 文件,/可有可无。

  • pwd 查看当前文件路径。例如:

    ericdai@ericdai-virtual-machine:~/Desktop$ pwd
    /home/ericdai/Desktop
    

操作文件命令

  • cp sydney.txt file2.txt 复制 sydney.txt 文件,副本重命名为 file2.txt

  • cat sydney.txt 查看文件 sydney.txt 的内容

  • diff file1.txt file2.txt 对比两个文件内容的差异

    file1.txt 内容:

    aa
    bb
    cc
    
    aa
    dd
    cc
    
    aa
    ee
    ff
    

    file2.txt 内容:

    aa
    
    cc
    
    aa
    bb
    cc
    
    aa
    cc
    gg
    

    命令执行结果:

    ericdai@ericdai-virtual-machine:~/Desktop$ diff file1.txt file2.txt
    2c2
    < bb
    ---
    >
    6c6
    < dd
    ---
    > bb
    10,11c10,11
    < ee
    < ff
    ---
    > cc
    > gg
    

    有差异的行是2、6、10、11

  • head file1.txt -n 5 查看文件 file1.txt 前5行的内容;

    tail file1.txt -n 5 查看文件 file1.txt 最后5行的内容。

  • wc file1.txt 查看文件 file1.txt 单词数(wc是word count的缩写。我们以题号9的file1文件内容为例)

    ericdai@ericdai-virtual-machine:~/Desktop$ wc file1.txt
    11  9 29 file1.txt
    

    11 9 29 表示 file1.txt 一共有11行,9个单词,29个字符。

  • wc -l file1.txt 只统计file1.txt有多少行

    ericdai@ericdai-virtual-machine:~/Desktop$ wc -l file1.txt
    11 file1.txt
    
  • wc -c file1.txt 只统计file1.txt的大小(有多少个字符)

    ericdai@ericdai-virtual-machine:~/Desktop$ wc -c file1.txt
    29 file1.txt
    
  • rm file1.txt 删除文件file1.txt

  • mv file1.txt helloword.txt 将文件file1.txt重命名为helloword.txt;

    mv file1.txt Tutorial/ 将文件file1.txt移动到Tutorial文件夹下(/可加可不加)。

查看系统时间命令

  • date 查看系统时间

    ericdai@ericdai-virtual-machine:~$ date
    2020年 09月 17日 星期四 11:57:42 CST
    
  • cal 打印本月日历

    ericdai@ericdai-virtual-machine:~$ cal
          九月 2020
    日 一 二 三 四 五 六
           1  2  3  4  5
     6  7  8  9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30
    
    
  • cal 2020 打印2020年全年日历

  • cal 1 2020 打印2020年1月份日历

less more 命令

  • less Main.java 当Main.java文件的内容在终端不能全部显示时,可以使用less命令,配合键盘上下左右方向键即可。推出按键盘字母q即可。
  • more Main.java 类似less,可以自己测试。

chmod 命令

ericdai@ericdai-virtual-machine:~/Desktop$ ls -l
total 12
-rw-r--r-- 1 ericdai ericdai   27 9月  17 10:51 file2.txt
-rw-r--r-- 1 ericdai ericdai  886 9月  15 16:56 Main.java
drwxrwxr-x 2 ericdai ericdai 4096 9月  17 12:10 Tutorial

我们看到当前用户ericdai有读Main.java文件的权限。

类型 user(作者) group(小组) other(其他)
-表示文件;d表示文件夹 rwx rwx rwx
  • chmod u-r Main.java 去掉当前用户读Main.java文件内容的权限(若有)

    ericdai@ericdai-virtual-machine:~/Desktop$ ls -l
    total 12
    -rw-r--r-- 1 ericdai ericdai   27 9月  17 10:51 file2.txt
    -rw-r--r-- 1 ericdai ericdai  886 9月  15 16:56 Main.java
    drwxrwxr-x 2 ericdai ericdai 4096 9月  17 12:10 Tutorial
    ericdai@ericdai-virtual-machine:~/Desktop$ chmod u-r Main.java
    ericdai@ericdai-virtual-machine:~/Desktop$ ls -l
    total 12
    -rw-r--r-- 1 ericdai ericdai   27 9月  17 10:51 file2.txt
    --w-r--r-- 1 ericdai ericdai  886 9月  15 16:56 Main.java
    drwxrwxr-x 2 ericdai ericdai 4096 9月  17 12:10 Tutorial
    ericdai@ericdai-virtual-machine:~/Desktop$ cat Main.java
    cat: Main.java: Permission denied
    

    执行完修改权限命令后,用户再次尝试读取Main.java文件内容,系统提示没有权限。

  • chmod u+r Main.java 可以把读权限加回来。

  • chmod go-r Main.java 除了ericdai用户(作者)外,其他人都没有读Main.java文件的权限。

  • 当然也可用二进制数修改u、g、o的权限。比如:chmod 444 Main.java 等价于把文件Main.java的权限修改为:r--r--r--

grep 命令

  • grep new Main.java 查看Main.java文件是否包含new这个字符串。如下:

    ericdai@ericdai-virtual-machine:~/Desktop$ grep void Main.java
        public static void main(String[] args) throws IOException {
    ericdai@ericdai-virtual-machine:~/Desktop$ grep new Main.java
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            File f = new File("/Users/ericdai/Desktop/aa");
        private static int[] a = new int[N];
        private static int[] b = new int[N];
        private static int[][] f = new int[N][N];
    

    注:new字符串会标红高亮显示。

  • grep ^H sydney.txt 找出所有以H开头的字符串。

  • grep ^Ho sydney.txt 找出所有以Ho开头的字符串。还有很多,可以查看正则表达式。

  • grep ^Ho sydney.txt | wc 找出所有以Ho开头的字符串并统计。这里是搭配的 wc ,你也可以使用其它命令,记得用 | 分割即可。

编写脚本

一些Linux命令或者其它一些命令,我们把它们写到一起,打包成一个文件,这个文件就是Linux脚本文件。Linux脚本文件以.sh后缀结尾。

  • > < 大于小于号是Linux的重定向符号

  • 实例演示:

    ericdai@ericdai-virtual-machine:~/Desktop$ ls
    file2.txt  Main.java  Tutorial
    ericdai@ericdai-virtual-machine:~/Desktop$ ls > 1.txt
    ericdai@ericdai-virtual-machine:~/Desktop$ ls
    1.txt  file2.txt  Main.java  Tutorial
    ericdai@ericdai-virtual-machine:~/Desktop$ cat 1.txt
    1.txt
    file2.txt
    Main.java
    Tutorial
    
  • 创建脚本文件 vim test.sh,写入以下内容:

    ls
    cal
    date
    

    执行脚本命令 sh test.sh

    ericdai@ericdai-virtual-machine:~/Desktop$ ls
    test.sh  Tutorial
    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    test.sh  Tutorial
          九月 2020
    日 一 二 三 四 五 六
           1  2  3  4  5
     6  7  8  9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30
    
    2020年 09月 17日 星期四 13:02:50 CST
    
  • 打印变量和字符串。test.sh脚本文件中我们写入以下内容:

    a=10
    echo $a
    
    echo "hello world"    $a
    

    注意a=10等于号前后不能有空格;空行不输出,"hello world"$a之间若有超过一个空格,只输出一个空格。字符串"hello world"的双引号可以省略不写,不过为了易读建议加双引号。

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    10
    hello world 10
    
  • 计算。test.sh脚本文件中我们写入以下内容:

    a=10
    b=3
    c=`expr $a + $b`
    echo $c
    d=`expr $a * $b`
    echo $d
    

    注意Linux脚本语言中*号的含义与正则表达式保持一致,若要实现乘法,需要加转义字符。另外想要输出()也需要转义,即()。再次强调,赋值运算符=左右两边一定不能写空格;+等运算符左右两边一定要写空格。

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    13
    30
    
  • 控制语句。

    等于 不等于 大于 大于等于 小于 小于等于
    -eq -ne -gt -ge -lt -le
    equal not equal greater than greater equal less than less equal

    test.sh脚本文件中我们写入以下内容(输出a和b中较大的那个):

    a=10
    b=3
    if [ $a -gt $b ]
    then
    	echo $a
    else
    	echo $b
    fi
    

    注意[ $a -gt $b ]之间一定要有空格。执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    10
    
  • for 循环。test.sh脚本文件中我们写入以下内容:

    #输出数字1~10
    for x in 1 2 3 4 5 6 7 8 9 10
    do
    	echo $x
    done
    

    注意Linux脚本语言中#号后边的内容是注释。

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
  • while 循环。test.sh脚本文件中我们写入以下内容:

    #输出数字1~10
    x=1
    while [ $x -le 10 ]
    do
    	echo $x
    	x=`expr $x + 1`
    done
    

    注意Linux脚本语言中#号后边的内容是注释。

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
  • 前面我们介绍了定义变量。现在我们再来介绍怎么定义字符串。test.sh脚本文件中我们写入以下内容:

    a="hello"
    b="world"
    
    #两个单词独立成行
    echo $a
    echo $b
    
    #两个单词显示在一行
    echo $a $b
    

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    hello
    world
    hello world
    
  • 与用户进行交互。test.sh脚本文件中我们写入以下内容:

    echo "Please enter a:"
    read a
    
    echo "Please enter b:"
    read b
    
    c=`expr $a + $b`
    echo $a + $b = $c
    

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    Please enter a:
    3
    Please enter b:
    5
    3 + 5 = 8
    
  • shell脚本语言中,比较两个字符串=!=。test.sh脚本文件中我们写入以下内容:

    password="hello123"
    
    echo "Please enter a password:"
    read userPassword
    
    if [ $password = $userPassword ]
    then
    	echo "密码正确"
    else
    	echo "密码错误"
    fi
    

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    Please enter a password:
    nicai
    密码错误
    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    Please enter a password:
    hello123
    密码正确
    
  • 字符串拼接和判空。-z 字符串空返回真,否则返回假;-n字符串非空返回真,否则返回假。test.sh脚本文件中我们写入以下内容:

    str1="hello"
    str2="world"
    str3=""
    
    echo "$str1 $str2"	#字符串拼接
    
    if [ -z $str3 ]
    then
    	echo "str3 是空的"
    else
    	echo "str3 不是空的"
    fi
    

    z是zero的缩写;n是not zero的缩写。执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    hello world
    str3 是空的
    
  • 数组。test.sh脚本文件中我们写入以下内容:

    arr=(7 8 9 10)
    echo ${arr[1]}	#打印数组的单个元素
    

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ sh test.sh
    test.sh: 1: Syntax error: "(" unexpected
    

    报错。sh是最传统的脚本语言处理程序,1979年有过一次升级,如果你的脚本代码中有使用数组,使用bash来运行脚本。

    ericdai@ericdai-virtual-machine:~/Desktop$ bash test.sh
    8
    

    那如何遍历数组元素呢?修改上边的test.sh脚本文件为:

    arr=(7 8 9 10)
    
    for i in ${arr[@]}
    do
    	echo $i
    done
    

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ bash test.sh
    7
    8
    9
    10
    

    进一步我们来求数组和。修改上边的test.sh脚本文件为:

    arr=(7 8 9 10)
    
    sum=0
    for i in ${arr[@]}
    do
    	sum=`expr $sum + $i`
    done
    
    echo $sum
    

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ bash test.sh
    34
    

    进一步我们求最大值。修改上边的test.sh脚本文件为:

    arr=(7 8 9 10)
    
    max=${arr[0]}
    for i in ${arr[@]}
    do
    	if [ $i -gt $max ]
    	then
    		max=$i
    	fi
    done
    
    echo $max
    

    执行上边的脚本:

    ericdai@ericdai-virtual-machine:~/Desktop$ bash test.sh
    10
    
  • Linux脚本语句也拆分直接在终端运行。例如:

    ericdai@ericdai-virtual-machine:~/Desktop$ a=10
    ericdai@ericdai-virtual-machine:~/Desktop$ echo $a
    10
    

Linux中的全局变量

  • USER 记录当前登陆系统的用户的用户名。

    ericdai@ericdai-virtual-machine:~/Desktop$ echo $USER
    ericdai
    
  • HOME 当前用户的主目录。

    ericdai@ericdai-virtual-machine:~/Desktop$ echo $HOME
    /home/ericdai
    ericdai@ericdai-virtual-machine:~/Desktop$ echo ~ #等价写法
    /home/ericdai
    

    进入用户的主目录。方法如下:

    ericdai@ericdai-virtual-machine:~/Desktop$ cd $HOME
    ericdai@ericdai-virtual-machine:~$
    ericdai@ericdai-virtual-machine:~/Desktop$ cd ~ #等价写法
    ericdai@ericdai-virtual-machine:~$
    

Linux中的环境变量PATH

ericdai@ericdai-virtual-machine:~/Desktop$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

例如我们在Desktop文件夹(/home/ericdai/Desktop)下创建C文件example.c,写入以下内容:

#include <stdio.h>

int main() {
	printf("Hello World
");
	return 0;
}

gcc编译运行:

ericdai@ericdai-virtual-machine:~/Desktop$ gcc example.c -o example
ericdai@ericdai-virtual-machine:~/Desktop$ ls
example  example.c  Tutorial
ericdai@ericdai-virtual-machine:~/Desktop$ ./example
Hello World

若我们换到其它路径下,再运行编译好的example程序:

ericdai@ericdai-virtual-machine:~/Desktop$ cd .. #返回到上级目录
ericdai@ericdai-virtual-machine:~/Desktop$ example
bash: example: command not found

因为当前路径是/home/ericdai

ericdai@ericdai-virtual-machine:~$ pwd
/home/ericdai

不是example所在目录/home/ericdai/Desktop。那么如果我想在当前路径不是/home/ericdai/Desktop路径情况下的任意路径都能运行example。我们只需要将example所在的路径/home/ericdai/Desktop放到PATH这个变量里面

ericdai@ericdai-virtual-machine:~/Desktop$ PATH=$PATH:/home/ericdai/Desktop #PATH尾部追加":/home/ericdai/Desktop"
ericdai@ericdai-virtual-machine:~/Desktop$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/ericdai/Desktop
ericdai@ericdai-virtual-machine:~/Desktop$ cd .. #返回到上级目录
ericdai@ericdai-virtual-machine:~$ example
Hello World

多个路径用冒号:分割(windows用分号;)。意思是这些路径下的文件在任意路径下都能运行。注意给PATH赋值不要写成PATH=/home/ericdai/Desktop,这样会覆盖PATH中原有的内容,而是要在尾部追加即可。

Linux环境变量总结

压缩和解压

  • zip CProgram.zip *将当前文件夹压缩(首先进入要压缩的文件夹)。例如,我们这里要压缩Tutorial文件夹:

    ericdai@ericdai-virtual-machine:~/Desktop$ ls
    example  example.c  Tutorial
    ericdai@ericdai-virtual-machine:~/Desktop$ cd Tutorial/
    ericdai@ericdai-virtual-machine:~/Desktop/Tutorial$ ls
    file1.txt #Tutorial文件夹下只有一个文件,没有文件夹
    ericdai@ericdai-virtual-machine:~/Desktop/Tutorial$ zip CProgram.zip *
      adding: file1.txt (deflated 17%)
    ericdai@ericdai-virtual-machine:~/Desktop/Tutorial$ ls
    CProgram.zip  file1.txt
    

    另外一种Linux里的压缩格式是tar,有些地方也叫tar.gz。使用tar压缩命令为(功能同上):

    ericdai@ericdai-virtual-machine:~/Desktop/Tutorial$ ls
    file1.txt
    ericdai@ericdai-virtual-machine:~/Desktop/Tutorial$ tar -zcvf CProgram.tar.gz ./
    ./
    ./file1.txt
    ./CProgram.tar.gz
    tar: .: file changed as we read it
    ericdai@ericdai-virtual-machine:~/Desktop/Tutorial$ ls
    CProgram.tar.gz  file1.txt
    
    • -z : Compress archive using gzip program(使用gzip压缩算法进行压缩);
    • -c : Create archive(创建目标。解压时替换c为x即可);
    • -v : Verbose i.e display progress while creating archive(显示压缩过程);
    • -f : Archive File name(重命名压缩文件,即可以给压缩文件起一个名字)。
  • zip CProgram.zip -r Tutorial/* 将当前文件夹Tutorial及其子文件夹压缩为CProgram.zip。

  • unzip CProgram.zip 解压CProgram.zip;

    tar -zxvf CProgram.tar.gz 解压CProgram.tar.gz(-x : Extract files)。

  • wget https://xxx/download/file.tar.gz 从网址下载file.tar.gz压缩文件;

    wget https://xxx/download/file.tar.gz -O file2.tar.gz 从网址下载file.tar.gz压缩文件并重命名为file2.tar.gz。大写字母O。

原文地址:https://www.cnblogs.com/hacker-x/p/13684259.html