ls 命令
-
ls -l显示当前目录下的文件夹及文件的详细信息(drwxr-xr-xd开头的是文件夹,-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 Videos4096是文件或文件夹的大小;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 fffile2.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.txt11 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.shzhangsan@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 不是空的" fiz是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。


评论区