shell 基础
-
基础信息
-
shell脚本扩展名为.sh 使用vi/vim创建即可
-
#!/bin/bash 通常为shell脚本第一行,*#!*告诉脚本使用什么解释器执行
-
执行方式
-
作为可执行程序
chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本
-
作为解释器参数
/bin/sh test.sh /bin/php test.php
第一行不需要指定解释器信息
-
-
-
shell变量
-
变量名和等号之间不能有空格
-
使用变量:变量名前面加美元符号 变量名外面的花括号是可选,帮助解释器识别边界
-
echo ${#string} #获取字符串长度
-
string="runoob is a great site" #从字符串第 2 个字符开始截取 4 个字符 echo ${string:1:4} # 输出 unoo
-
string="runoob is a great site" #查找字符 i 或 o 的位置(哪个字母先出现就计算) echo `expr index "$string" io` # 输出 4
-
-
数组
-
定义数组 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]}
-
-
注释
-
单行注释 #
-
多行注释
:<<EOF 注释内容... 注释内容... 注释内容... EOF
-
-
传递参数
- 第一个参数$1,第二个参数$2,以此内推
- 其他字符
- $#传递参数个数
- $$当前进程号
- $*单字符串显示所有传递参数
- $@依次显示所有传递参数
-
运算符
-
算术运算符
-
使用expr命令实现,
#!/bin/bash val=`expr 2 + 2` echo "两数之和为 : $val"
注意:表达式和运算符之间要有空格,乘号(*)前边必须加反斜杠(\)才能实现乘法运算.
条件表达式要放在方括号之间,并且要有空格
-
-
关系运算符
- -eq 相等
- -ne 不相等
- -gt 大于
- -lt 小于
- -ge 大于等于
- -le 小于等于
-
布尔运算符
- ! 非运算
- -o 或运算
- -a 与运算
-
逻辑运算符
- && 逻辑AND
- || 逻辑OR
-
字符串运算符
- = 两个字符串相等返回true
- != 两个字符串不等返回true
- -z 长度为0返回true
- -n 长度不为0返回true
- $ 不为空返回true
-
-
echo
- 显示普通字符串 echo “It is a test”
- 显示转义字符串 echo “\“It is a test\””
- 显示变量 echo $val
- 显示换行 echo -e “OK! \n” -e 开启转义
- 显示结果定向至文件 echo “It is a test” > myfile
- 显示命令执行结果 echo 反引号内
-
流程控制
-
if语句
-
if 语句语法格式:
if condition then command1 command2 ... commandN fi
-
写成一行(适用于终端命令提示符):
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
-
if注意:条件用方括号括起来,与if和内部条件语句均有空格;if和elif条件后加then;结尾以fi结尾;展开写不需要加;终端模式用;分隔.
-
-
for语句
-
for循环一般格式为:
for var in item1 item2 ... itemN do command1 command2 ... commandN done
-
for中命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。
-
for循环还有一种C语言风格的语法,常用于计数、打印数字序列:
for (( expr1 ; expr2 ; expr3 )) ; do list ; done -
for注意:for中条件后以do开始,done结束
-
-
while语句
-
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:
while condition do command done
-
可以配合let命令,let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
#!/bin/bash int=1 while(( $int<=5 )) do echo $int let "int++" done
-
-
case … esac多选择语句
-
每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。
-
可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
case … esac 语法格式如下:
case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac
-
注意:取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配不到时,可以用*捕获该值。
-
跳出循环
- break命令允许跳出所有循环(终止执行后面的所有循环)
- continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环
-
-
-
shell函数
-
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
-
shell中函数的定义格式如下:
[ function ] funname [()] { action; [return int;] }
说明:
- 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
- 函数返回值在调用该函数后通过 $? 来获得。调用函数仅使用其函数名即可。
- 调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
- $10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数
- 输入输出重定向
- command > file 将输出重定向到 file
- command >> file 将输出以追加的方式重定向到 file
- command1 < file1 本来需要从键盘获取输入的命令会转移到文件读取内容
- command1 < infile > outfile 同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中
- Shell test 命令
-
shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
-
例:
num1=100 num2=100 if test $[num1] -eq $[num2] then echo '两个数相等!' else echo '两个数不相等!' fi
代码中的 [] 执行基本的算数运算
- 其他
- 单引号是告诉Shell忽略特殊字符,而双引号则解释特殊符号原有的意义
- $()放的是命令,和反引号作用一样,${}放的是变量,起到一个边界作用,$(())作整数运算,[]和test是等同的