跳至主要內容

Shell 不讲武德

未央大约 2 分钟

今日惊闻 🐏🐻 被shell欺负了!

下午 🐏🐻 在群里发了一段shell,如下:

sheep shell problem
sheep shell problem

🐏🐻 被欺负之处如三条红线所划,俺梳理了一番,此三处分为两大招,三小式:

  1. Bash Conditional Expressionsopen in new window$i -lt $N
  2. Shell Expansionsopen in new window

首先,🐏🐻 你要知道在shell中使用变量的方式是在变量前加一个$符,然后我们分析一下这三个问题。

第一个问题就是简单的条件判断。lt就是less than的缩写,shell中诸如此类的操作符还有-eq -ne -le -gt -ge,相信聪明的 🐏🐻 一定知道是什么意思。

第二个是给变量赋默认值的问题。表达式形式是这样的${parameter:-word},如果parameter有值的话则表达式的值为parameter,否则表达式的值为word,即默认值为word

这里还有个小知识点,shell的参数。执行shell时可以向脚本传递参数,脚本内获取参数的格式为:$nn代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推……

N=${1:-3}中的1即代表shell的第一个参数。所以这条语句是什么意思,🐏🐻 你懂了没?

第三个问题其实就是想做个i = i + 1的操作,但是原生bash不支持简单的数学运算,所以要曲线救国。🐏🐻 发的这段shell中采用了Arithmetic Expansion,形如$(( expression ))。对应$(($i + 1))就是取变量i的值加一在取表达式整体的值。🐏🐻 你懂了没?

即然是曲线救国,那肯定不只有一条。🐏🐻,俺在多告诉你几条。

  1. let,该命令用于执行一个或多个表达式,变量计算中不需要加上$来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来,如let i++

  2. expr,该命令也用于执行表达式。不同之处在于expr命令要和待求值的表达式一起被反引号`包起来,如`expr $i + 1`

🐏🐻,俺还给你写了个小 demo,你拿去康康:

#!/bin/bash

message="🐏🐻枣🦆"

N=${1:-3}

i=0
while [ $i -lt $N ]
do
  echo $message
  # let i++
  # i=`expr $i + 1`
  # i=$(($i + 1))
  i=$((i + 1))
done

执行结果如下:

  1. 不给参数,给N赋默认值3
$ ./demo.sh
🐏🐻枣🦆
🐏🐻枣🦆
🐏🐻枣🦆
  1. 给个参数1
$ ./demo.sh 1
🐏🐻枣🦆
  1. 给个参数5
$ ./demo.sh 5
🐏🐻枣🦆
🐏🐻枣🦆
🐏🐻枣🦆
🐏🐻枣🦆
🐏🐻枣🦆

🐏🐻,你学废了吗?