ls 命令
-
ls -l
显示当前目录下的文件夹及文件的详细信息(drwxr-xr-x
d开头的是文件夹,-rwxr-xr-x
-开头的是文件)zhangsan@zhangsan-virtual-machine:~$ ls -l total 36 drwxr-xr-x 2 zhangsan zhangsan 4096 8月 19 22:51 Desktop drwxr-xr-x 2 zhangsan zhangsan 4096 8月 19 22:51 Documents drwxr-xr-x 2 zhangsan zhangsan 4096 8月 19 22:51 Downloads drwxr-xr-x 2 zhangsan zhangsan 4096 8月 19 22:51 Music drwxr-xr-x 2 zhangsan zhangsan 4096 8月 19 22:51 Pictures drwxr-xr-x 2 zhangsan zhangsan 4096 8月 19 22:51 Public drwxr-xr-x 3 zhangsan zhangsan 4096 8月 19 22:53 snap drwxr-xr-x 2 zhangsan zhangsan 4096 8月 19 22:51 Templates drwxr-xr-x 2 zhangsan zhangsan 4096 8月 19 22:51 Videos
4096
是文件或文件夹的大小;8月 19 22:51
文件或文件夹的创建时间。 -
ls
显示当前目录下的文件夹名及文件名(若存在),不显示其它信息。
clear 命令
clear
清空当前终端窗口的内容
cd 命令
cd ..
往前退一个目录路径(进入上层文件目录)
操作文件夹命令
-
mkdir tutorial/
在当前目录下创建文件夹 tutorial,/
可有可无。 -
rmdir tutorial/
删除当前目录下的 tutorial 文件,/
可有可无。 -
pwd
查看当前文件路径。例如:zhangsan@zhangsan-virtual-machine:~/Desktop$ pwd /home/zhangsan/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
命令执行结果:
zhangsan@zhangsan-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文件内容为例)zhangsan@zhangsan-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有多少行zhangsan@zhangsan-virtual-machine:~/Desktop$ wc -l file1.txt 11 file1.txt
-
wc -c file1.txt
只统计file1.txt的大小(有多少个字符)zhangsan@zhangsan-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
查看系统时间zhangsan@zhangsan-virtual-machine:~$ date 2020年 09月 17日 星期四 11:57:42 CST
-
cal
打印本月日历zhangsan@zhangsan-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 命令
zhangsan@zhangsan-virtual-machine:~/Desktop$ ls -l
total 12
-rw-r--r-- 1 zhangsan zhangsan 27 9月 17 10:51 file2.txt
-rw-r--r-- 1 zhangsan zhangsan 886 9月 15 16:56 Main.java
drwxrwxr-x 2 zhangsan zhangsan 4096 9月 17 12:10 Tutorial
我们看到当前用户zhangsan有读Main.java文件的权限。
类型 | user(作者) | group(小组) | other(其他) |
---|---|---|---|
- 表示文件;d 表示文件夹 |
rwx | rwx | rwx |
-
chmod u-r Main.java
去掉当前用户读Main.java文件内容的权限(若有)zhangsan@zhangsan-virtual-machine:~/Desktop$ ls -l total 12 -rw-r--r-- 1 zhangsan zhangsan 27 9月 17 10:51 file2.txt -rw-r--r-- 1 zhangsan zhangsan 886 9月 15 16:56 Main.java drwxrwxr-x 2 zhangsan zhangsan 4096 9月 17 12:10 Tutorial zhangsan@zhangsan-virtual-machine:~/Desktop$ chmod u-r Main.java zhangsan@zhangsan-virtual-machine:~/Desktop$ ls -l total 12 -rw-r--r-- 1 zhangsan zhangsan 27 9月 17 10:51 file2.txt --w-r--r-- 1 zhangsan zhangsan 886 9月 15 16:56 Main.java drwxrwxr-x 2 zhangsan zhangsan 4096 9月 17 12:10 Tutorial zhangsan@zhangsan-virtual-machine:~/Desktop$ cat Main.java cat: Main.java: Permission denied
执行完修改权限命令后,用户再次尝试读取Main.java文件内容,系统提示没有权限。
-
chmod u+r Main.java
可以把读权限加回来。 -
chmod go-r Main.java
除了zhangsan用户(作者)外,其他人都没有读Main.java文件的权限。 -
当然也可用二进制数修改u、g、o的权限。比如:
chmod 444 Main.java
等价于把文件Main.java的权限修改为:r--r--r--
grep 命令
-
grep new Main.java
查看Main.java文件是否包含new这个字符串。如下:zhangsan@zhangsan-virtual-machine:~/Desktop$ grep void Main.java public static void main(String[] args) throws IOException { zhangsan@zhangsan-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/zhangsan/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的重定向符号 -
实例演示:
zhangsan@zhangsan-virtual-machine:~/Desktop$ ls file2.txt Main.java Tutorial zhangsan@zhangsan-virtual-machine:~/Desktop$ ls > 1.txt zhangsan@zhangsan-virtual-machine:~/Desktop$ ls 1.txt file2.txt Main.java Tutorial zhangsan@zhangsan-virtual-machine:~/Desktop$ cat 1.txt 1.txt file2.txt Main.java Tutorial
-
创建脚本文件
vim test.sh
,写入以下内容:ls cal date
执行脚本命令
sh test.sh
zhangsan@zhangsan-virtual-machine:~/Desktop$ ls test.sh Tutorial zhangsan@zhangsan-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"
的双引号可以省略不写,不过为了易读建议加双引号。执行上边的脚本:
zhangsan@zhangsan-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脚本语言中
*
号的含义与正则表达式保持一致,若要实现乘法,需要加转义字符\
。另外想要输出()
也需要转义,即\(\)
。再次强调,赋值运算符=
左右两边一定不能写空格;+
等运算符左右两边一定要写空格。执行上边的脚本:
zhangsan@zhangsan-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
]
之间一定要有空格。执行上边的脚本:zhangsan@zhangsan-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脚本语言中
#
号后边的内容是注释。执行上边的脚本:
zhangsan@zhangsan-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脚本语言中
#
号后边的内容是注释。执行上边的脚本:
zhangsan@zhangsan-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
执行上边的脚本:
zhangsan@zhangsan-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
执行上边的脚本:
zhangsan@zhangsan-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
执行上边的脚本:
zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh Please enter a password: nicai 密码错误 zhangsan@zhangsan-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的缩写。执行上边的脚本:
zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh hello world str3 是空的
-
数组。test.sh脚本文件中我们写入以下内容:
arr=(7 8 9 10) echo ${arr[1]} #打印数组的单个元素
执行上边的脚本:
zhangsan@zhangsan-virtual-machine:~/Desktop$ sh test.sh test.sh: 1: Syntax error: "(" unexpected
报错。sh是最传统的脚本语言处理程序,1979年有过一次升级,如果你的脚本代码中有使用数组,使用bash来运行脚本。
zhangsan@zhangsan-virtual-machine:~/Desktop$ bash test.sh 8
那如何遍历数组元素呢?修改上边的test.sh脚本文件为:
arr=(7 8 9 10) for i in ${arr[@]} do echo $i done
执行上边的脚本:
zhangsan@zhangsan-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
执行上边的脚本:
zhangsan@zhangsan-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
执行上边的脚本:
zhangsan@zhangsan-virtual-machine:~/Desktop$ bash test.sh 10
-
Linux脚本语句也拆分直接在终端运行。例如:
zhangsan@zhangsan-virtual-machine:~/Desktop$ a=10 zhangsan@zhangsan-virtual-machine:~/Desktop$ echo $a 10
Linux中的全局变量
-
USER
记录当前登陆系统的用户的用户名。zhangsan@zhangsan-virtual-machine:~/Desktop$ echo $USER zhangsan
-
HOME
当前用户的主目录。zhangsan@zhangsan-virtual-machine:~/Desktop$ echo $HOME /home/zhangsan zhangsan@zhangsan-virtual-machine:~/Desktop$ echo ~ #等价写法 /home/zhangsan
进入用户的主目录。方法如下:
zhangsan@zhangsan-virtual-machine:~/Desktop$ cd $HOME zhangsan@zhangsan-virtual-machine:~$ zhangsan@zhangsan-virtual-machine:~/Desktop$ cd ~ #等价写法 zhangsan@zhangsan-virtual-machine:~$
Linux中的环境变量PATH
zhangsan@zhangsan-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/zhangsan/Desktop
)下创建C文件example.c,写入以下内容:
#include <stdio.h>
int main() {
printf("Hello World\n");
return 0;
}
gcc编译运行:
zhangsan@zhangsan-virtual-machine:~/Desktop$ gcc example.c -o example
zhangsan@zhangsan-virtual-machine:~/Desktop$ ls
example example.c Tutorial
zhangsan@zhangsan-virtual-machine:~/Desktop$ ./example
Hello World
若我们换到其它路径下,再运行编译好的example程序:
zhangsan@zhangsan-virtual-machine:~/Desktop$ cd .. #返回到上级目录
zhangsan@zhangsan-virtual-machine:~/Desktop$ example
bash: example: command not found
因为当前路径是/home/zhangsan
:
zhangsan@zhangsan-virtual-machine:~$ pwd
/home/zhangsan
不是example所在目录/home/zhangsan/Desktop
。那么如果我想在当前路径不是/home/zhangsan/Desktop
路径情况下的任意路径都能运行example。我们只需要将example所在的路径/home/zhangsan/Desktop
放到PATH这个变量里面
zhangsan@zhangsan-virtual-machine:~/Desktop$ PATH=$PATH:/home/zhangsan/Desktop #PATH尾部追加":/home/zhangsan/Desktop"
zhangsan@zhangsan-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/zhangsan/Desktop
zhangsan@zhangsan-virtual-machine:~/Desktop$ cd .. #返回到上级目录
zhangsan@zhangsan-virtual-machine:~$ example
Hello World
多个路径用冒号:
分割(windows用分号;
)。意思是这些路径下的文件在任意路径下都能运行。注意给PATH赋值不要写成PATH=/home/zhangsan/Desktop
,这样会覆盖PATH中原有的内容,而是要在尾部追加即可。
压缩和解压
-
zip CProgram.zip *
将当前文件夹压缩(首先进入要压缩的文件夹)。例如,我们这里要压缩Tutorial文件夹:zhangsan@zhangsan-virtual-machine:~/Desktop$ ls example example.c Tutorial zhangsan@zhangsan-virtual-machine:~/Desktop$ cd Tutorial/ zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ ls file1.txt #Tutorial文件夹下只有一个文件,没有文件夹 zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ zip CProgram.zip * adding: file1.txt (deflated 17%) zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ ls CProgram.zip file1.txt
另外一种Linux里的压缩格式是
tar
,有些地方也叫tar.gz
。使用tar
压缩命令为(功能同上):zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ ls file1.txt zhangsan@zhangsan-virtual-machine:~/Desktop/Tutorial$ tar -zcvf CProgram.tar.gz ./ ./ ./file1.txt ./CProgram.tar.gz tar: .: file changed as we read it zhangsan@zhangsan-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。
评论区