shell脚本
shell脚本
1.执行
1.1 #!/bin/bash 它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell
1.2 echo "Hello World !"
1.3 vi test.sh 新建shell脚本
1.4 chmod -x ./test.sh 将脚本变为可执行文件
1.5 ./test.sh 或者/bin/bash ./test.sh 执行脚本
2.变量
2.1 your_name="songhao" =两边不能有空格 变量命名规范和java一样
2.2 除了显式地直接赋值,还可以用语句给变量赋值,如:for file in `ls /etc` 以上语句将 /etc 下目录的文件名循环出来。
2.3 只读变量readonly myUrl
2.4 unset myUrl 为删除变量,删除完以后的变量不可以使用
2.5 shell 中主要的变量类型有字符串和数字,字符串可以用单引号也可以用双引号,但是单引号中是无法引入变量的。
2.6 获取字符串长度 string='songhao' echo ${#string} 输出为7
2.7 截取字符串 string='songhao' echo ${string:1:4} 输出为 ongh 第一个字符的索引是0
2.8 查找字符串 string='songhao' echo `expr index "$string" ah` 输出5
2.9注释
单行注释 #
块注释 定义注释关键字 :<< ! 注释的内容 !
3.参数传递
3.1 执行shell脚本的时候,我们可以向脚本传递参数,脚本获取参数的方式是 $n, n是第n个参数。
3.2 显示参数个数:$#,显示所有参数$* #以一个字符串输出 $@ 每个参数都是一个字符串输出
4.数组
4.1 定义: 数组名=(值1 值2 值3 值4 ....) 或者 数组名[0]=值1 、数值名[1]=值2 #可以不使用连续下标,而且下标没有范围限制
4.2 读取: ${数组名[下标]} 读取全部则 ${数组名[@]} #输出是以字符串的格式输出 格式为 '值1 值2 值3'
4.3 获取数组长度: ehco ${#数组名[@]}
5.运算符
5.1 算术运算符
val=`expr 2 + 3` echo "结果为 $val" 输出为5
注:
1.表达式之间必须要有空格
2.表达式必须要用``包裹
3.条件表达式必须放在方括号之间 例如:[$a == $b]
4.乘法必须要在* 的左边加上\才可以实现运算
5.if...then...fi 是条件语句
5.2 关系运算符(只支持数字,不支持字符串,除非字符串的值是数字)
-eq:判断是否相等
-ne: 判断是否不相等
-gt: 相等于大于号
-lt: 相等于小于号
-ge: 大于等于
-le: 小于等于
5.3 布尔运算符
! 非运算,例如:[!false] 则为true
-o 或运算 or
-a 与运算 and
5.4 逻辑运算符
&& and
|| or
5.5 字符串运算符
=: 判断两个字符串是否相等
!=: 判断两个字符串是否不相等
-z:判断字符串长度是否为0
-n:判断字符串长度是否不为0
$: 判断字符串是否为空
5.6 文件测试运算符
-... file
6.echo命令
6.1 输出"",需要用到转义字符 echo "\"\""
6.2 read 变量名 命令,类似于java的scanner,变量值需要执行完脚本手动输入
6.3 echo -e "OK! \n" 显示换行 -e 开启转义
6.4 echo -e "OK! \c" 显示不换行
6.5 echo "my name is songhao!" > myName 显示结果定向至文件 #会自动创建文件,如果没有指定目录会到当前目录下
6.6 echo '$name\"' 不转义或者取变量用单引号
6.7 echo `date` `` 执行命令
7.printf命令
与echo命令相比,输出格式更加强大
8.test命令
test可以理解为[] 是逻辑判断
9.Shell 流程控制
1.if else
if condition then command1 else command2 fi 中不可有分支的代码为空
2.if else-if else
if condition1 then command1 elif condition2 then command2 else command3 fi
3.for 循环
for var in item1 item2 ... itemN
do command1 command2 ... commandN done
例子:
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
4.while
while condition
do
command
done
例子:
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
5.until循环
6.case ... esac
7.break 终止后面所有循环
8.continue 终止本次循环
10.函数
10.1 返回值的函数定义,例如:
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
10.2 有返回值的函数定义,例如:
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
# 注:函数返回值在调用该函数后通过 $? 来获得。
10.3 有入参的函数,例如:
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
# 注:$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
11.shell输入输出重定向
1.输出内容
command1 > file1 将内容输出到file1,覆盖原来的内容,如果想在文件末尾追加,则需要使用 >>
2.输入命令
command1 < file1 读取file的命令并且执行
3.输入输出
command1 < infile > outfile,同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
12.shell文件包含
. filename 或者 source filename 把filename文件引入
注:被引入的文件不需要可执行