Skip to main content

02.Bash脚本基础知识

1变量

1.1变量声明和使用

$ your_name="qinjx" # 声明
$ echo $your_name # 使用
$ echo ${your_name} # 使用

1.2 声明只读变量

$ myUrl="http://www.w3cschool.cc"
$ readonly myUrl
$ myUrl="http://www.runoob.com" # 无法重新赋值
read-only variable: myUrl

1.3 删除变量

$ unset variable_name

2数据类型

相较于其它开发语言,bash的数据类型很少,仅有:String boolean Array Int

2.2 字符串类型的声明和使用

2.2.1 定义字符串

$ str1='this is a string'                                  #单引号里的任何字符都会原样输出,字符串中的变量是无效的
$ str2="Hello, I know your are \"$str1\"! \n" #双引号里可以有变量和转义字符

2.2.2 读取字符串长度

$ string="abcd"
$ echo ${#string} #输出 4

2.2.3 分割提取子字符串

$ string="runoob is a great site"
$ echo ${string:1:4} # 输出 unoo ,从字符串第 2 个字符开始截取 4 个字符:

2.2.4 查找子字符串

$ string="runoob is a great company"
$ echo `expr index "$string" is` # 输出 8

2.3 数据的定义和使用

2.3.1 定义数组

$ array_name=(value0 value1 value2 value3)
$ #或者
$ array_name=(
$ value0
$ value1
$ value2
$ value3
$ )
$ #单独定义各数组变量
$ rray_name[0]=value0
$ array_name[1]=value1

2.3.2 读取数组

$ valuen=${array_name[n]}  #读取单个数组
$ echo ${array_name[@]} #读取多个数组

2.3.3 数组的长度

$ # 取得数组元素的个数
$ length=${#array_name[@]}
$ # 或者
$ length=${#array_name[*]}
$ # 取得数组单个元素的长度
$ lengthn=${#array_name[n]}

3 逻辑运算

$ #加算
$ val=`expr 2 + 2`
$ echo "两数之和为 : $val"
$ #减算
$ `expr $a - $b`
$ #乖算
$ `expr $a \* $b`
$ #除算
$ `expr $b / $a`
$ #除余
$ `expr $b % $a`
$ #赋值
$ a=$b
$ #相等
$ [ $a == $b ] #返回布尔值
$ #不相等
[ $a != $b ] #返回布尔值

4 流程处理

4.1 if判断

 a=10
b=20
if [ $a != $b ]
then
echo "a 不等于 b"
else
echo "conditions not met"
fi

4.2 case流程

case ${1} in
  "hello")
  echo "Hello, how are you ?"
  ;;
   "")
  echo "You MUST input parameters, ex> {${0} someword}"
  ;;
  *) #其实就相当于万用字元,0~无穷多个任意字元之意!
  echo "Usage ${0} {hello}"
  ;;
  esac

4.3 $?判断上一条命令是否执行成功


yarn build

if [ $? != 0 ]; then
RED='\033[0;31m'
echo -e "❌ ❌ ❌ ${RED} React build failure."
exit
fi

5 函数和参数

5.1 声明一个函数

function setProxy()
{
echo "Set proxy successfully \n";
}
调用结果
$ setProxy
Set proxy successfully

5.2 函数的参数

function printSomeThing()
{
echo "print first parameter $1 \n";
echo "all parameter $@ \n";
}
调用结果
$ printSomeThing hello world
print first parameter hello
all parameter hello world

5.3 子shell(subshell)

subshell是指在当前进程中,再创建一个新的进程,去执行其它的命令,这样做的好处是,可以把一些可能会崩溃的逻辑转移到子进程进行处理,从而不会造成当 当进程的异常退出。

result=$( (echo "hello") )
printf "%s\n" "$result" # hello

5.4 默认变量

变量名说明
$@获取当前所有的参数
$?获取上一次执行命令的情况 0为成功,反之失败
$1, $2, $3, ...第1个参数,第2个参数,...

6 远程执行脚本

6.1 The normal way.

假设要去远程主机上执行ls -ahl命令,那么脚本如下:

script.sh
ssh <user>@domain.com <<END
ls -ahl;
exit;
END

6.1 Sudo way.

For example:

#!/usr/bin/env bash

# 1. Upload ./c.yaml to remote server.

content=$(cat ./local/c.yaml)
remote_path="/remote/c.yaml"

# 2. Upload ./c.yaml to remote server.
echo "$content" | ssh -T <username>@<host name> "sudo tee $remote_path > /dev/null"