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

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

创新互联主要从事成都网站制作、成都网站设计、外贸营销网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务榆次,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108

 
 
 
  1.   ~ bash --version |grep version 
  2. GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu) 
  3.   ~ zsh --version 
  4. zsh 5.8 (x86_64-ubuntu-linux-gnu) 

 1.数学表达式

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

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

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

 
 
 
  1. $ 56 + 72 
  2. 56 + 72 
  3. 56: command not found 

 再看一个复合表达式:

 
 
 
  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. $ echo The radius is $radius. 
  2. The radius is 5. 

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

 
 
 
  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,1 splash 
  3.   └─tmux: server,2628 new -s spirit 
  4.       └─bash,2629 
  5.           └─bash,15190 -v 
  6.               └─pstree,26568 -asp 15190 

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

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

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

4.函数

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

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

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

 
 
 
  1. $ function square { 
  2.      echo $(( $1 ** 2 )) 

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

 
 
 
  1. $ square 11 
  2. 121 
  3. $ square 121 
  4. 14641 

 5.条件语句

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

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

 
 
 
  1. if commands; then 
  2.    commands 
  3.  [elif commands; then 
  4.    commands...] 
  5.  [else 
  6.    commands] 
  7.  fi 

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

 
 
 
  1. function abs { 
  2.     if (( $1 > 0 )); then echo $1 
  3.     elif (( $1 = 0 )); then echo 0 
  4.     else echo $(( -$1 )) 
  5.     fi 

 测试新定义的abs函数:

 
 
 
  1. abs -110 
  2. 110  

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

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

 6.循环结构

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

 
 
 
  1. $ for i in *; do echo $i; done 
  2. anaconda3 
  3. backup.doom.d 
  4. backup.gnus.el 
  5.  
  6. $ for i in {A..E}; do echo $i; done 

 以及 while 语句

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

 7.读取键盘输入

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

 
 
 
  1. find . -iname "*.pdf" | while read line; do something 

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

 
 
 
  1. read -p "Enter one or more values.>" 
  2. echo "REPLY = '$REPLY'" 

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

 
 
 
  1. read  -t 10 -p  "Enter secret passphrase" 

8.收尾总结

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

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

 【编辑推荐】

  1. 为SEO学习Python 分享7个技巧帮助你做数据分析工作
  2. 国内很受欢迎的浏览器:市占率高达58%,全球有超10亿人在用
  3. Windows10必备5款软件,让你的电脑更好用,请低调使用
  4. 如何部署一个生产级别的 Kubernetes 应用
  5. 并发编程之Phaser原理与应用

本文名称:帮你精通Shell脚本编程:构筑程序基石的7项基本元素
文章路径:http://www.mswzjz.com/qtweb/news28/165628.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联