shell脚本文件
运行
.sh后缀不是必须的
# 方法1
sh hello.sh
# 方法2
chmod +x hello.sh
./hello.sh
解释器
第一行需要约定解释器, #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
#!/bin/bash
变量
定义变量时,变量名不加美元符号;使用变量时,前面加 $ 符号,大括号可有可无,视具体情况。
echo 输出变量
unset 删除变量
your_name="runoob.com"
echo $your_name
echo ${your_name}
unset your_name
字符串
单引号 引号内的内容原封不动输出,单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号内可以有变量,可以出现转义符
获取字符串长度 #,例如 ${#str}
str='this is a string'
your_name="runoob"
str="Hello, I know you are "$your_name"! \n"
echo -e $str
echo ${#str}
数组
定义:格式如 数组名=(值1 值2 ... 值n),值之间用空格隔开 单独定义数组的各个分量:array_name[0]=value0 可以不使用连续的下标,而且下标的范围没有限制。
读取数组:一般格式是 ${数组名[下标]} ,下标[n]或[*]表示全部元素
获取数组长度 #,例如 ${#array_name[*]}
array_name=(value0 value1 value2 value3)
array_name[0]=value0
valuen=${array_name[n]}
echo ${array_name[@]}
echo ${#array_name[*]}
关联数组
类似map,以字符串或整数作为访问数组的key,使用 declare -A 命令来声明
declare -A array_name
declare -A site=(["google"]="www.google.com", ["runoob"]="www.runoob.com", ["taobao"]="www.taobao.com")
# 也可以先声明后赋值
declare -A site
site["google"]="www.google.com"
#使用
echo ${site["google"]}
注释
单行注释 # 开头
段落注释:#后一对花括号
#--------------------------------------------
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
shell 传递参数
0 为执行的文件名(包含文件路径);1为传递的第一个参数,依次类推;$#为传递的参数个数。
注意,10 不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。
传递的所有参数: * 以"1 2 … n"的形式输出所有参数 @ 以"1" "2" … "n" 的形式输出所有参数
# 使用$*
for i in "$*"
do
echo "the arg is $i"
done
echo "=================="
# 使用$@
for j in "$@"
do
echo "the arg is $j"
done
# 输出结果
the arg is 1 2 3
==================
the arg is 1
the arg is 2
the arg is 3
条件语句
if-else
如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和 < 。
if else 的 [...] 判断语句中大于使用 -gt,小于使用 -lt。
if condition
then
command1
...
commandN
elif condition2
then
command2
else
command
fi
# 示例
if [ "$a" -gt "$b" ]; then
...
fi
if (( a > b ))
then
...
fi
test命令
test 命令用于检查某个条件是否成立
数值测试,符号按下表

字符串测试

num1=100
num2=100
if test $[num1] -eq $[num2] #或者这么写 if (( $num1 == $num2 ))
then
echo '两个数相等!'
fi
# 代码中的 [] 执行基本的算数运算,注意等号两边不能有空格
result=$[num1+num2]
echo "result 为: $result"
num1="ru1noob"
num2="runoob"
if test $num1 = $num2 #或者这么写 if [ $num1 == $num2 ]
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
for循环
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
GROUP=('test' 'wzz' 'hhh')
for item in ${REVIEW_GROUP[*]}
do
echo "循环REVIEW_GROUP: $item"
if test $1 = $item
then
echo "相等$item"
res=$item
break
else
echo "不相等$item"
fi
done
函数
函数定义格式如下
- 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
[ function ] funname [()]
{
action;
[return int;]
}
函数参数:同脚本参数,常用# * @ 1...$n等
? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得。
function demoFun1(){
echo "这是我的第一个 shell 函数!"
return `expr 1 + 1`
}
demoFun1
echo $?
echo $?
# 以下是输出结果
这是我的第一个 shell 函数!
2
0
运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。如果不放在引号里,直接使用是会输出的。
例如,两个数相加(注意使用的是反引号 **` 而不是单引号 * '*** ):
expr 111 + 111 # 会打印出222
val=`expr 2 + 2`
echo "两数之和为 : $val"
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a * $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
vim快捷键
| 快捷键 | 操作 |
|---|---|
| $ | 跳到行尾 |
| 跳到行首 | |
| dd | 删除当前行 |
| ndd | 删除n行 |
| cc | 删除当前行并进入编辑模式 |
| u | 撤销 |