python与shell

107 阅读4分钟

Python与Shell语法对比

1. 基本语法结构

Shell (Bash)

#!/bin/bash
# 注释以#开头
echo "Hello World"  # 打印输出
var="value"        # 变量赋值
echo $var          # 使用变量

Python

#!/usr/bin/env python3
# 注释以#开头
print("Hello World")  # 打印输出
var = "value"        # 变量赋值
print(var)           # 使用变量

2. 变量与数据类型

Shell

  • 弱类型,所有变量都是字符串
  • 变量赋值等号两边不能有空格
  • 使用变量需要加$前缀
name="John"
age=25
echo "Name: $name, Age: $age"

Python

  • 强类型,有明确的数据类型
  • 赋值等号两边可以有空格
  • 直接使用变量名
name = "John"
age = 25
print(f"Name: {name}, Age: {age}")  # f-string格式化

3. 条件判断

Shell

if [ "$age" -gt 18 ]; then
    echo "Adult"
elif [ "$age" -gt 12 ]; then
    echo "Teenager"
else
    echo "Child"
fi

Python

if age > 18:
    print("Adult")
elif age > 12:
    print("Teenager")
else:
    print("Child")

4. 循环结构

Shell (for循环)

for i in {1..5}; do
    echo "Number: $i"
done

# 遍历数组
fruits=("apple" "banana" "cherry")
for fruit in "${fruits[@]}"; do
    echo "Fruit: $fruit"
done

Python (for循环)

for i in range(1, 6):
    print(f"Number: {i}")

# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(f"Fruit: {fruit}")

5. 函数定义

Shell

function greet() {
    local name=$1  # 局部变量
    echo "Hello, $name"
}
greet "Alice"

Python

def greet(name):
    """函数文档字符串"""
    print(f"Hello, {name}")
greet("Alice")

6. 文件操作

Shell

# 读取文件
while IFS= read -r line; do
    echo "$line"
done < "file.txt"

# 写入文件
echo "content" > file.txt

Python

# 读取文件
with open("file.txt", "r") as f:
    for line in f:
        print(line.strip())

# 写入文件
with open("file.txt", "w") as f:
    f.write("content")

7. 执行系统命令

Shell (原生支持)

ls -l
result=$(date)
echo "Today is $result"

Python (需要subprocess模块)

import subprocess

# 执行命令
subprocess.run(["ls", "-l"])

# 获取命令输出
result = subprocess.check_output(["date"])
print(f"Today is {result.decode().strip()}")

8. 错误处理

Shell

if ! command; then
    echo "Command failed"
    exit 1
fi

Python

try:
    result = subprocess.run(["some_command"], check=True)
except subprocess.CalledProcessError as e:
    print(f"Command failed with exit code {e.returncode}")

9. 数组/列表操作

Shell

array=("a" "b" "c")
echo "First element: ${array[0]}"
echo "All elements: ${array[@]}"
echo "Array length: ${#array[@]}"

Python

lst = ["a", "b", "c"]
print(f"First element: {lst[0]}")
print(f"All elements: {lst}")
print(f"List length: {len(lst)}")

10. 字符串操作

Shell

str="hello world"
echo ${str:0:5}       # 切片
echo ${str/world/you} # 替换
echo ${#str}          # 长度

Python

s = "hello world"
print(s[0:5])        # 切片
print(s.replace("world", "you"))  # 替换
print(len(s))        # 长度

主要区别总结

特性Shell (Bash)Python
设计目的系统管理和文件操作通用编程
执行方式解释执行先编译为字节码再执行
变量类型弱类型(字符串为主)强类型
代码结构依赖换行和分号依赖缩进
跨平台性主要在Unix-like系统跨平台
性能执行快(简单命令)复杂操作更快
可读性简单命令直观,复杂逻辑难读结构清晰易读
调试工具有限有完善的调试工具
扩展性有限丰富的标准库和第三方库
适用场景系统管理、简单文件操作复杂逻辑、数据处理、网络应用

何时使用哪种语言

使用Shell(Bash)当:

  • 需要调用大量系统命令
  • 进行简单的文件操作
  • 编写系统管理脚本
  • 需要快速编写一次性脚本

使用Python当:

  • 需要复杂逻辑和数据结构
  • 需要跨平台兼容性
  • 处理复杂字符串和数据
  • 需要代码可维护性和可扩展性
  • 需要访问网络或使用高级库

两者经常结合使用,通过Python调用Shell命令或通过Shell调用Python脚本,发挥各自优势。

python基础

  1. Python 中 is== 的区别?
a = [1, 2, 3]
b = a
c = [1, 2, 3]

print(a == b)  # True
print(a is b)  # True
print(a == c)  # True
print(a is c)  # False

-   `==` 比较值是否相等
-   `is` 比较是否是同一个对象(内存地址相同)

2.浅拷贝深拷贝

import copy

lst = [1, [2, 3]]
shallow = copy.copy(lst)
deep = copy.deepcopy(lst)

lst[1][0] = 99
print(shallow)  # [1, [99, 3]] 受影响
print(deep)     # [1, [2, 3]] 不受影响

浅拷贝不会复制嵌套对象本身,而是复制对象的引用
深拷贝会递归地复制对象及其所有嵌套的对象,创建一个新的独立对象,并且所有的元素也会被完全复制
  1. 反转字符串
s = "hello"
print(s[::-1])  # "olleh"

4 判断回文

问题:检查一个字符串是否是回文(即正着读和反着读都一样)。

def is_palindrome(s: str) -> bool:
    return s == s[::-1]

5 实现一个单例模式

问题:如何实现 Python 中的单例模式?

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance
  1. Python 中的 GIL (全局解释器锁)

解释 Python 中的 GIL 是什么?它对多线程有什么影响?

GIL(Global Interpreter Lock)是 Python CPython 解释器中的一种机制,它确保同一时刻只有一个线程在执行 Python 字节码。它的存在使得 Python 在多核 CPU 上的多线程执行受限,因此 Python 多线程更适用于 I/O 密集型任务,而不适合 CPU 密集型任务。在 CPU 密集型任务中,可以使用多进程而不是多线程来充分利用多核 CPU。

  1. Python 中的内存管理与垃圾回收

Python 是如何进行内存管理的?它的垃圾回收机制是怎样的?

Python 使用引用计数来进行内存管理,每当对象的引用计数为 0 时,内存会被释放。此外,Python 还使用了垃圾回收机制(GC)来处理循环引用的情况,通常是通过标记-清除算法来回收不再使用的对象。