1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/zsh

# 函数
is_prime() {
local num=$1
if [ $num -lt 2 ]; then
return 1 # 返回false
fi # 表示if代码块的结束
for ((i=2; i*i<=num; i++)); do
if [ $((num % i)) -eq 0 ]; then
return 1 # 返回false
fi
done
return 0 # # 返回true
}

read -p "请输入一个正整数:" number

if is_prime $number; then
echo "$number 是素数。"
else
echo "$number 不是素数。"
fi

1. Shebang (#!/bin/zsh)

  • #!/bin/zsh 是脚本的第一行,称为 Shebang。
  • 它指定了脚本使用的解释器,这里是 zsh
  • 当脚本运行时,操作系统会使用 /bin/zsh 来执行脚本。

2. 函数定义 (is_prime)

  • 使用 function_name() { ... } 的语法定义了一个函数。
  • 函数名是 is_prime,它接受一个参数 $1(即传递给函数的第一个参数)。
  • 函数体用 { ... } 包裹。

3. 局部变量 (local num=$1)

  • local 关键字用于声明局部变量,变量的作用域仅限于函数内部。shell 的变量默认在脚本内是全局的
  • num=$1 将函数的第一个参数赋值给变量 num
  • 注意在shell中,等号’=’的两边不能有空格

4. 条件判断 (if [ $num -lt 2 ]; then)

  • if 是条件判断语句,用于检查条件是否为真。
  • [ ... ] 是 Shell 中的条件测试语法(等同于 test 命令)。
  • -lt 是数值比较运算符,表示“小于”(less than)。类似的比较符还有-gt,-eq,-ge等等,和mybatisPlus很像
  • if [ $num -lt 2 ]; then 的意思是“如果 $num 的值小于 2”。
  • 注意 []两边必须留出一个空格

1. if [ ... ] 的语法

  • [ ... ] 是 Shell 中的条件测试语法(等同于 test 命令)。
  • [ ... ] 中,变量需要加上 $ 符号来引用其值。
  • 注意两边必须留出一个空格

2. if (( ... )) 的语法

  • (( ... )) 是 Shell 中的算术运算语法。
  • (( ... )) 中,变量名可以直接使用,不需要加 $ 符号。

5. 返回值 (return 1return 0)

  • return 用于从函数中返回值。
  • 在 Shell 中,0 表示成功(真),非 0 值表示失败(假)。
  • return 1 表示函数返回“不是素数”,return 0 表示函数返回“是素数”。

shell 的函数不能 return true 或者 false。只能用数字来表示 true/false。

  • 0 表示 true。
  • 0 值表示 false。

6. 循环 (for ((i=2; i*i<=num; i++)); do)

  • for (( ... )) 是 C 风格的 for 循环语法,就不过多解释了。
  • dodone 之间的代码是循环体。

7. 算术运算 ($((num % i)))

  • $(( ... )) 是 Shell 中的算术运算语法。
  • num % i 计算 num 除以 i 的余数。
  • -eq 0 是条件测试,检查余数是否等于 0。
  • 也可以改为 if((num % i == 0))

8. 用户输入 (read -p "请输入一个正整数:" number)

  • read 命令用于从标准输入读取用户输入。
  • -p 选项用于显示提示信息("请输入一个正整数:")。
  • 用户输入的值会被存储在变量 number 中。

9. 函数调用 (if is_prime $number; then)

  • is_prime $number 调用 is_prime 函数,并将 number 作为参数传递。
  • 函数的返回值决定了 if 语句的执行逻辑。

10. 条件分支 (if ... then ... else ... fi)

  • if ... then ... else ... fi 是 Shell 中的条件分支语句。
  • 如果 if 条件为真,执行 then 后面的代码块。
  • 如果 if 条件为假,执行 else 后面的代码块。
  • fi 表示 if 语句的结束。

11. 输出 (echo "$number 是素数。")

  • echo 命令用于输出文本到标准输出。
  • "$number 是素数。" 是输出的字符串,$number 会被替换为变量的值。

12. 全局变量

shell 中使用 $来引用全局变量,如 zsh 中的配置文件.zshrc 会配置很多全局变量,如:

1
2
3
export JAVA_HOME=/Users/xyhao/Library/Java/JavaVirtualMachines/corretto-11.0.26/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.

那么在 shell 脚本中就能直接用$JAVA_HOME 来得到/Users/xyhao/Library/Java/JavaVirtualMachines/corretto-11.0.26/Contents/Home这个字符串。

这也可以解释为什么配置好了 Java 环境后,在任何一个目录的命令行里输入 java -v就可以打印出 Java 的版本,因为JAVA_HOME 被注册为了全局变量