shell脚本:基础知识

3,865 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

前言:因为学习husky这个类库,遇到了shell脚本但是却不是很熟悉,所以总结一下,下篇更新学习husky.

shell脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。 由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。

第一个shell脚本

#!/bin/bash
echo "Hello World !"
  • #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
  • echo 命令用于向窗口输出文本。

运行

  • 将上面的代码保存为 test.sh,并 cd 到相应目录:
  • ./test.sh #执行脚本

Shell-变量

  • 定义变量时,变量名不加美元符号
name='caiji'

命名规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线 _。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量:

name="caiji"
echo $your_name
echo ${your_name}

只读变量:

  • 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
readonly name="caiji"
name = 'caiji2'
  • /bin/sh: NAME: This variable is read only.

删除变量:

unset name
  • 变量被删除后不能再次使用。unset 命令不能删除只读变量。

Shell 字符串

单引号

str='this is a string'
  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号

name="caiji"
str="Hello, I know you are \"$name\"! \n"
echo $str
  • 获取字符串长度 ${#name}
  • 提取子字符串 ${name1:4}

Shell 传递参数

  • 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

另外,还有几个特殊字符用来处理参数:

  • '$#' :参数个数
  • '$*' :显示所有的参数。
  • '$$' :当前进程ID号
  • '$!' :后台运行的最后一个进程的ID号.
  • '$?' :显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

Shell 数组

-Bash Shell 只支持一维数组(不支持多维数组)

array_name=(value1 value2 ... valuen)
  • 读取数组:${array_name[index]}

Shell 基本运算符

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符

expr:表达式计算工具,使用它能完成表达式的求值操作。

#!/bin/bash

val=`expr 2 + 2`
echo "两数之和为 : $val"

算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法expr $a + $b 结果为 30。
-减法expr $a - $b 结果为 -10。
*乘法expr $a \* $b 结果为 200。
/除法expr $b / $a 结果为 2。
%取余expr $b % $a 结果为 0。
=赋值a=$b 把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ a==a == b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ a!=a != b ] 返回 true。

关系运算符

运算符说明举例
-eq相当于==[ aeqa -eq b ] 返回 false。
-ne相当于!==[ anea -ne b ] 返回 true。
-gt相当于>[ agta -gt b ] 返回 false。
-lt相当于<[ alta -lt b ] 返回 true。
-ge相当于>=[ agea -ge b ] 返回 false。
-le相当于<=[ alea -le b ] 返回 true。

流程判断

1.if 判断

  if condition
  then
      command1 
      command2
      ...
      commandN 
  fi//末尾的 fi 就是 if 倒过来拼写

2.for 循环

  for loop in 1 2 3 4 5
  do
      echo "The value is: $loop"
  done

3.while 语句

  while condition
  do
      command
  done 

实例

#!/bin/bash

a=10
b=20
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b : a 不等于 b"
fi

布尔运算符

运算符说明举例
!取反[ ! false ] 返回 true。
-o或运算。[ alt20oa -lt 20 -o b -gt 100 ] 返回 true。
-a与运算。[ alt20aa -lt 20 -a b -gt 100 ] 返回 false。

逻辑运算符

运算符说明举例
&&and运算[[ a -lt 100 && b -gt 100 ]] 返回 false
or运算[[ $a -lt 100$b -gt 100 ]] 返回 true