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"