帮你精通Shell脚本编程:构筑程序基石的7项基本元素

2025-05-29 0 64

此系列课程的 Shell 适用bash和zsh。

  1. ➜~bash–version|grepversion
  2. GNUbash,version5.0.17(1)-release(x86_64-pc-linux-gnu)
  3. ➜~zsh–version
  4. zsh5.8(x86_64-ubuntu-linux-gnu)

1.数学表达式

学习编程,我们本能的起点自然是如何进行数学运算,如何处理数学表达式。在bash中,实现这一点稍微有些繁琐,我们需要将表达式放入到 $((…))中。

  1. echo$((60*60*24))#计算一天有多少秒
  2. 86400

先暂且不理会$((…))的具体含义,先记着需要将我们所熟知的数学表达式嵌入其中即可,因为如果直接键入数学表达式,会当场报错。

  1. $56+72
  2. 56+72
  3. 56:commandnotfound

再看一个复合表达式:

  1. $echo$(((3+5+7)*(2+(4*6))))
  2. echo$(((3+5+7)*(2+(4*6))))
  3. 390

作为shell-script的第一步,现在我们知道,终端就是一个便携的计算器。

2.命名与变量

我们的记忆力有限,不大容易记住一长串的数字或者一段程序。编程语言为此提供的核心解决途径就是命名。命名的方式简单直接。

  1. $radius=5 #注意等号两侧不能有空格
  2. radius=5

读取变量的时候,则需要前缀 $将其解索引:

  1. $echoTheradiusis$radius.
  2. Theradiusis5.

接下来,我们计算圆的面积:

  1. $radius=5;pi=3;area=$(($pi*$radius**2));echo$area
  2. 75

于是我们可以直接用抽象的名字进行数学运算。

3.常量与环境变量

我们可以命名变量,但是变量的取名并非完全自由,不能与系统的环境变量相冲突。比如查看当前bash的进程号:

  1. $echo$BASHPID
  2. 15190

查阅完整的进程树:

  1. $pstree-asp$BASHPID
  2. systemd,1splash
  3. └─tmux:server,2628new-sspirit
  4. └─bash,2629
  5. └─bash,15190-v
  6. └─pstree,26568-asp15190

倘若好奇系统中有多少环境变量,应该求问env或者printenv命令:

  1. $env|nl|tail-n5
  2. 87DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
  3. 88MAIL=/var/mail/gaowei
  4. 89LC_NUMERIC=en_US.UTF-8
  5. 90KONSOLE_DBUS_WINDOW=/Windows/1
  6. 91_=/usr/bin/env

如结果所示,当前系统中有91个环境变量。

4.函数

与变量相比较,函数是更为强大更具表现力的抽象工具。我们可以将 function 当作执行特定任务的‘黑匣子’。函数的的语法为:

  1. functionfunction_name{
  2. command…
  3. }
  4. 或者
  5. function_name(){
  6. command…
  7. }

函数的应用,我们还是从熟悉的简单数学运算出发,求给定数的平方。

  1. $functionsquare{
  2. echo$(($1**2))
  3. }

函数体中$1是新鲜事物,乃是指代第一个参数的位置参数,应用这个函数:

  1. $square11
  2. 121
  3. $square121
  4. 14641

5.条件语句

到目前为止,我们定义的程序表达力expressive-power极为有限。因为我们尚且没有途径做出种种测试,并根据测试的不同结果来决定下一步的操作,也就是赋予程序以智能。

此时,我们需要引入条件判断,基本结构为:

  1. ifcommands;then
  2. commands
  3. [elifcommands;then
  4. commands…]
  5. [else
  6. commands]
  7. fi

我们尝试求绝对值的函数:

  1. functionabs{
  2. if(($1>0));thenecho$1
  3. elif(($1=0));thenecho0
  4. elseecho$((-$1))
  5. fi
  6. }

测试新定义的abs函数:

  1. abs-110
  2. 110

除了三项简单的逻辑判断符号 <>=之外,还可以使用复合逻辑操作符:

  1. $command1&&command2#and逻辑
  2. $command1||command2#or逻辑
  3. $!#not

6.循环结构

Looping结构,首先想到的当然是 for 语句:

  1. $foriin*;doecho$i;done
  2. anaconda3
  3. backup.doom.d
  4. backup.gnus.el
  5. $foriin{A..E};doecho$i;done
  6. A
  7. B
  8. C
  9. D
  10. E

以及 while 语句

  1. count=1
  2. while[["$count"-le5]];do
  3. echo"$count"
  4. count=$((count+1))
  5. done
  6. echo"Finished."

7.读取键盘输入

程序极为重要的一点是与用户的沟通与互动。我最爱用read取代xargs,例如这样的结构:

  1. find.-iname"*.pdf"|whilereadline;dosomething

Read 有多个有意思的参数,首先是-p,prompt

  1. read-p"Enteroneormorevalues.>"
  2. echo"REPLY='$REPLY'"

其次 -t 限定用户的反馈时间:

  1. read-t10-p"Entersecretpassphrase"

8.收尾总结

本文我们探讨了 ShellScript的七项基本元素:

  1. 数学表达式
  2. 变量与命名
  3. 常量与环境变量
  4. 函数
  5. 条件语句
  6. 循环语句
  7. Read

原文地址:https://www.toutiao.com/i6904424219946271244/

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 帮你精通Shell脚本编程:构筑程序基石的7项基本元素 https://www.kuaiidc.com/96337.html

相关文章

发表评论
暂无评论