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"