1.Ubuntu用vim编写和运行Python代码

xiaoyu@xiaoyu-VMware-Virtual-Platform:~$ mkdir -p Projects/Python
xiaoyu@xiaoyu-VMware-Virtual-Platform:~$ cd ./Projects/Python
xiaoyu@xiaoyu-VMware-Virtual-Platform:~$ vim Hello.py

按i键进入输入模式

然后Hello.py中输入:

print("Hello World!")

按Esc键回到普通模式,输入:wq,保存并退出

xiaoyu@xiaoyu-VMware-Virtual-Platform:~/Projects/Python$ python3 Hello.py
Hello World!
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/Projects/Python$

python3 文件名.py

就可以运行Python文件了

xiaoyu@xiaoyu-VMware-Virtual-Platform:~/Projects/Python$ vim guessNumber.py

同上,编写如下Python代码:

import random
number = random.randint(1,100)
cnt = 0
while True:
    num = int(input("请输入您猜测的数字:"))
    cnt += 1
    if num == number:
        print(f"恭喜您,猜对了。您一共猜了{cnt}次。")
        break
    elif num < number:
        print("猜小了,请再猜一次")
    else:
        print("猜大了,请再猜一次")

同理保存并退出

xiaoyu@xiaoyu-VMware-Virtual-Platform:~/Projects/Python$ python3 guessNumber.py
请输入您猜测的数字:50
猜大了,请再猜一次
请输入您猜测的数字:25
猜小了,请再猜一次
请输入您猜测的数字:34
猜小了,请再猜一次
请输入您猜测的数字:42
猜小了,请再猜一次
请输入您猜测的数字:46
猜小了,请再猜一次
请输入您猜测的数字:48
恭喜您,猜对了。您一共猜了6次。
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/Projects/Python$

2.Centos7上编写Python代码

[root@master ~]# python --version
Python 2.7.5
[root@master ~]# ls
anaconda-ks.cfg
[root@master ~]# cd /
[root@master /]# ls
bin  boot  demo01  dev  etc  folder3  home  lib  lib64  media  mnt  opt  parent  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@master /]# mkdir Projects/Python
mkdir: cannot create directory ‘Projects/Python’: No such file or directory
[root@master /]# mkdir -p Projects/Python
[root@master /]# vim Projects/Python/Hello.py
[root@master /]# python Projects/Python/Hello.py
Hello Python! Hello Centos7!
[root@master /]# cd Projects/Python
[root@master Python]# ls
Hello.py
[root@master Python]# cd -
/
[root@master /]# cd ./Projects/Python
[root@master Python]# ls
Hello.py
[root@master Python]# cat Hello.py
print("Hello Python! Hello Centos7!")
[root@master Python]# 

3.Centos7上编写Java代码

[root@master Projects]# mkdir Java
[root@master Projects]# ls
Java  Python
[root@master Projects]# cd Java
[root@master Java]# vim BinarySearch.java
  1 public class BinarySearch {
  2         public static void main(String[] args) {
  3                 int[] arr = {-9, -7, -5, -1, 0, 1, 2, 8, 12, 17, 25, 26 };
  4                 System.out.println(binarySearch(arr, 12 ));
  5                 System.out.println(binarySearch(arr, -12));
  6         }
  7 
  8         private static int binarySearch(int[] arr, int target) {
  9                 int left = 0, right = arr.length - 1;
 10                 while (left <= right) {
 11                         int mid = left + (right - left) /  2; // 防止int类型溢出
 12                         if (arr[mid] == target) {
 13                                 return mid;
 14                         } else if (arr[mid] < target) {
 15                                 left = mid + 1;
 16                         } else {
 17                                 right = mid - 1;
 18                         }
 19                 }
 20 
 21                 return -1;
 22         }
 23 }
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
~                                                                                                                                                                                                 
:set number

编写上述Java代码,并在普通模式下输入“ :set nunber”可以临时显示行号

保存并退出

[root@master Java]# javac BinarySearch.java # 编译Java代码
[root@master Java]# ls
BinarySearch.class  BinarySearch.java
[root@master Java]# java BinarySearch.java # 运行Java程序
Error: Could not find or load main class BinarySearch.java
[root@master Java]# java BinarySearch.calss # 运行Java程序
Error: Could not find or load main class BinarySearch.calss
[root@master Java]# java BinarySearch # 运行Java程序
8
-1

注意注意,千万要注意:

使用java命令运行Java文件时不能加后缀名,无论是.java还是.class都不能加

原因:

  • Java程序运行机制:在编译阶段,用javac(Java Compiler)处理源文件(即.java文件),因此需要加上.java后缀名。而在运行阶段,Java则在加载类,后面不需要后缀名,只需要类名
  • java命令会启动JVM(Java虚拟机),JVM需要加载的是类名(class name),类名对应的是BinarySearch.class文件中的二进制字节码。然后JVM会自动查找BinarySearch.class文件中并执行其中的main方法

注意:

运行java程序要用javac命令编译,编译完成之后会生成.class文件,然后再使用java命令去让JVM执行.class文件,java命令后面跟的是类名,不能是.class文件的路径

javac命令编译源文件(.java文件),有-cp参数,这个参数的作用是告诉编译器去哪里找被引用的第三方类(依赖,import导入的类),于java命令的-cp参数的作用有区别(java命令的-cp参数作用是告诉Java虚拟机JVM到哪里去找已经编译好的.class文件或,jar包)

.jar包是Java中用于打包和分发类文件、资源文件的标准归档格式,JAR = Jave Archive(Java归档文件)。.jar包本质上是一个特殊的ZIP文件

类比说明
Windows的.exe可执行程序(如果包含主类)
Linux的.deb/.rpm软件包,方便分发
Python的.whl打包好的库
普通的.zip但多了清单文件和类加载机制

[root@master ~]# ls
anaconda-ks.cfg  hadoop-3.1.4.tar.gz
[root@master ~]# cd /
[root@master /]# ls
bin  boot  data  demo01  dev  etc  home  lib  lib64  media  mnt  opt  parent  proc  Projects  root  run  sbin  srv  sys  tmp  usr  var
[root@master /]# cd demo01
[root@master demo01]# ls
Hello.class  Hello.java
[root@master demo01]# java Hello # 在Hello.class所在的目录下使用java命令,可以不使用-cp参数
Hello Hadoop!
[root@master demo01]# cd 
[root@master ~]# java /demo01/Hello # 不在Hello.class所在的目录下要运行它,必须要使用-cp指定路径,如果不用-cp参数直接指定.class的路径,则java命令会将这个路径当成类名,这显然是错误的,没有这样的类名
Error: Could not find or load main class .demo01.Hello
[root@master ~]# java /demo01/Hello.class
Error: Could not find or load main class .demo01.Hello.class
[root@master ~]# java -cp . Hello
Error: Could not find or load main class Hello
[root@master ~]# cd /demo01
[root@master demo01]# ls
Hello.class  Hello.java
[root@master demo01]# java -cp . Hello # -cp .表示让JVM在当前目录下去找.class文件
Hello Hadoop!

命令参数接受原因
javac文件路径.java 文件)编译器需要读取源文件,就像 catvim 一样
java类名(不是文件路径)JVM 需要通过类名 + classpath 机制加载类

-cp和-classpath参数的效果一致

[root@master ~]# java -cp /demo01/ Hello
Hello Hadoop!
[root@master ~]# java -classpath /demo01 Hello
Hello Hadoop!

写法含义JVM如何查找
-cp /demo01/路径带斜杠把 /demo01/ 当作目录,去里面找 Hello.class
-cp /demo01路径不带斜杠把 /demo01 当作目录,去里面找 Hello.class

结论:对于目录,加不加末尾的 /,JVM 处理方式完全相同

JVM 在解析 classpath 时,会自动规范化路径:

  • /demo01/ → 标准化为 /demo01

  • /demo01 → 保持 /demo01

两者最终指向同一个目录。

下列情况末尾加/和不加/时有区别:

1.当路径指向一个.jar包时

# 正确:指向具体的 jar 文件
java -cp /demo01/lib.jar Hello

# 错误:末尾加斜杠会被当作目录,但 lib.jar/ 不是目录
java -cp /demo01/lib.jar/ Hello   # ❌ 找不到类

2.当使用通配符*时:

# 加载 /demo01 目录下所有 jar 包
java -cp "/demo01/*" Hello

# 末尾加斜杠含义不同
java -cp "/demo01/*/" Hello   # 试图找名为 * 的目录,语法错误
路径写法效果
-cp "/demo01/*"加载 /demo01 目录下的所有 .jar 文件
-cp "/demo01/"只加载 /demo01 目录下的类文件.class
-cp "/demo01"同上,加载目录下的类文件

这里加双引号包裹起来详细可以自己搜索它的作用

在Linux实际操作中,什么时候要在目录末尾加/什么时候不用加/:

你想做什么写法加 /
进入目录cd /path❌ 不加
查看目录内容ls /path❌ 不加
删除整个目录rm -rf /path❌ 不加
复制目录到别处cp -r /path /dest❌ 不加
复制目录内容到别处cp -r /path/* /dest/❌ 不加(用通配符)
同步目录内容(rsync)rsync -av /src/ /dst/✅ 源和目标都加
打包目录tar -czf file.tar.gz /path❌ 不加
打包目录内容cd /path && tar -czf file.tar.gz .用 . 代替
检查路径是否是目录[ -d /path ]❌ 不加

日常操作统一不加 /,只在以下两种情况加:

  1. 使用 rsync 且确定要同步内容时

  2. 需要穿透符号链接查看目标目录时

记住:除非你知道为什么需要加 /,否则就不加。这是最安全的做法。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐