原版文档地址
https://www.gnu.org/software/bash/manual/bash.html
1.Shell 变量
变量的基本赋值
var=value
var 是变量名,value 为变量值;
如果变量值不包含任何空格字符,可以直接赋值给变量;
如果变量值包含空格字符,则必须包括在双引号 "" 或者单引号 '' 内;
var="Hello world."
Shell引用变量
引用一个普通变量
myName=Wrong;
myAge=28;
echo $myName $MyAge
当变量可能会和其他文字组合会音箱占位符时,可以用${temp}来引用变量
例如:
echo myNickName is: ${myName}Try
引用特殊变量
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
declare|
typeset [+/-][选项] 变量名
选项:
-:给变量舍得类型属性
+:取消变量的类型属性
-a:将变量声明为数组型
-A:将变量声明为数组型
-i:将变量声明为整型
-x:将变量声明为环境变量
-r:将变量声明为只读变量
-p:查看变量的被声明的类型
shell支持的基本数据类型
字符串
if [ str1 = str2 ] 当两个串有相同内容、长度时为真
if [ str1 != str2 ] 当串str1和str2不等时为真
if [ -n str1 ] 当串的长度大于0时为真(串非空)
if [ -z str1 ] 当串的长度为0时为真(空串)
if [ str1 ] 当串str1为非空时为真
2.Shell Array数组
数组的定义与赋值
在 Shell 中,
- 用括号来表示数组,数组元素用"空格"符号分割开
定义数组的一般形式为
数组名=(值1 值2 ... 值n)
array_name=(value0 value1 value2 value3); array_name=( value0 value1 value2 value3 );
- 可以单独定义数组的各个分量:
array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen
- 可以不使用连续的下标,而且下标的范围没有限制也就是说下标不用强制联系。
读取数组元素值的一般格式
${数组名[下标]}
例如:
valuen=${array_name[n]}
使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
把字符串当数组来使用
获取数组的长度和获取某个元素的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
删除数组中的元素
unset array_name[index]
截取数组中的元素
复制新数组时顺带使用正则替换元素
3.Shell Map
申明Map
declare -A myMap=(["my01"]="01" ["my02"]="02")
myMap["my03"]="03"
myMap["my04"]="04"
输出Map所有的key、value、长度
# 1)输出所有的key
#若未使用declare声明map,则此处将输出0,与预期输出不符,此处输出语句格式比arry多了一个!
echo ${!myMap[@]}
#2)输出所有value
#与array输出格式相同
echo ${myMap[@]}
#3)输出map长度
#与array输出格式相同
echo ${#myMap[@]}
4.Shell Function函数
函数定义
申明一个函数
[ function ] funname [()]
{
action;
[return int;]
}
说明:上述的括号[]代表可选
- 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
- 3、所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
函数参数
传递一个或多个参数
function method(){
//输入的多个参数会被当作动态数组来处理
echo ${1},${2},${n}//获取指定位置的参数
echo ${@}//获取输入的全部参数
echo ${*} //获取输入的全部参数
echo ${#} //获取输入参数的个数
}
传递一个或多个数组作为参数
arr_1=(1 2 3 4 5 6);
arr_2=( a b c d e f );
method ${arr_1[@]} ${arr_2[@]}
//method里接受到的是arr_1+arr_2里的全部元素组成的新数组
传递map(通过反射)
declare -A map=(["x"]=(1 2 3 4 5 ) ["y"]=( a b c d e f ));
function test_method_recive_map_param(){
local mp=$(declare -p "$1")//输入的第一个参数的地址
eval "declare -A local ref="${mp#*=}
echo keys:${!ref[@]}
echo values:${ref[@]} echo ${mp}
}
test_method_recive_map_param map
5.Shell Native Call本地调用
在shell里调用一些本地命令,然后获取执行结果,例如:有一个定时器会定期调用一个重启某个进程(例如tomcat端口固定为8080)的脚本,
6.Shell test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
数值测试
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
实例
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
输出结果:
两个数相等!
代码中的 [] 执行基本的算数运算,如:
实例
#!/bin/bash
a=5
b=6
result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"
结果为:
result 为: 11
字符串测试
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
实例
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
输出结果:
两个字符串不相等!
文件测试
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
实例
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
输出结果:
文件已存在!
另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如:
实例
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi
输出结果:
至少有一个文件存在!
7.Shell 流程控制
if
if 语句语法格式:
if condition then command1 command2 ... commandN fi
写成一行(适用于终端命令提示符):
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
末尾的 fi 就是 if 倒过来拼写。
字符串的比较
if [ str1 = str2 ] 当两个串有相同内容、长度时为真
if [ str1 != str2 ] 当串str1和str2不等时为真
if [ -n str1 ] 当串的长度大于0时为真(串非空)
if [ -z str1 ] 当串的长度为0时为真(空串)
if [ str1 ] 当串str1为非空时为真
if else
if else 语法格式:
if condition then command1 command2 ... commandN else command fi
if else-if else
if else-if else 语法格式:
if condition1 then command1 elif condition2 then command2 else commandN fi
不用if 利用[express]||continue 拦截代码被执行
8.Shell 输入输出
9.Shell 可移植性与扩展
10.Shell Security 安全问题