Shell笔记
文章目录
- 查看默认shell类型:
ehco $SHELL
- 查看支持的shell类型:
cat /etc/shells
一、使用方式
-
命令直接输入并执行
echo hello
-
通过编辑脚本
# 新建脚本test.sh (写脚本的时候最好添加 #!/bin/bash 指定编译脚本的编译器) #!/bin/bash echo hello echo hello2
二、运行方式
- sh运行:
sh t.sh
- bash运行:
bash t.sh
- 绝对路径运行:
/root/t.sh
- - 相对路径运行:
./t.sh
- source指令执行:```source t.sh``
三、脚本规范
-
文件命名
- 不要使用数字开头
- 不使用shell关键字作为文件名
- 文件后缀为.sh
-
文件内容
-
首行:
#!/bin/bash
-
等号前后不含空格
-
[]内容前后留空格* 如 [ name ]
-
变量引用使用双引号和大括号:“{name}”
-
-
注释
-
单行注释: # 作为单行注释
-
多行注释:
# :<<加指定注释符开头,以开头指定的注释符为结尾,中间区域为注释区 :<<! 注释内容 注释内容 ! :<<K 注释内容 注释内容 K
-
四、shell本地变量
-
变量规范
- 不能以数字开头
- 区分大小写
- 变量名和等号直接不要有空格
- 使用
$加变量名
使用变量的值
-
变量查看方式
- echo $变量名
- echo “$变量名”
- echo ${变量名}
- echo “${变量名}”
-
取消变量
- unset 变量名:
unset name
- unset 变量名:
-
本地变量
-
普通变量
-
变量名=变量值 :中间不能含有空格
name=Li # 正确 name = Li #错误 name=L i #错误
-
变量名=‘变量值’ :单引号里面必须全部为字符串
name='Li' # 单引号会把内容当做字符串处理,不会解析其中的变量 name2='$name U'
-
变量名=“变量值”:双引号如果有其他变量,则会解析变量
name2="$name U" # name会解析为它的值
-
-
命令变量
用户自定义的变量,变量值为shell命令执行的结果-
变量名=
命令
list=`ls` echo $list
-
变量名=$(命令)
list=$(ls) echo $list
-
-
-
read 读取外部变量
read -p "提示信息" 变量名 如:read -p "请输入目录" targetdir
#!/bin/bash read -p "请输入目录" targetdir ls ${targetdir}
五、全局变量
-
export: 设置全局变量
export NAME=Li
-
unset:取消全局变量
unset NAME
脚本文件去获取命令行中声明的变量
六、内置变量
-
特殊的变量
序号 变量 含义 1 $0 脚本名 2 $1-$9 参数位置1-9 3 $# 参数的个数 4 $* 所有参数 #! /bin/bash echo "第一个参数:${1}" echo "第三个参数:${3}" echo "文件名:$0" echo "所有参数:$*" echo "参数个数$#"
-
输出当前的所在目录
#! /bin/bash result=`pwd` echo "当前目录:${result}"
-
输出统计文件个数
#! /bin/bash #内置变量实现 count=`ls $1 | wc -l` echo "$1下的子级个数:${count}"
#读取键盘录入 read -p "请您输入一个目录:" mydir count=`ls ${mydir} | wc -l` echo "${mydir}目录下子级个数是:${count}"
七、运算符
-
算数运算符:
格式:$((数学表达式)) 符号:+ - * /
-
比较运算符:
语法:[ 表达式 ]
序号 符号 说明 1 -eq [equal] 等于 2 -ne [no equal] 不等于 3 -gt [greate then] 大于 4 -ge [greate equal] 大于等于 5 -lt [less than] 小于 6 -le [less equal] 小于等于 $?:最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误) ,0也可以理解为true
-
逻辑运算符
序号 表达 说明 1 -a [and] 且 2 -o [or] 或 3 ! 非 -
字符串比较
序号 表达 说明 1 == 判断字符串内容是不是一样 2 != 判断2个字符串内容是不是一样 3 -z 判断字符串是不是空串 -
文件判断
序号 参数 格式 说明 1 -e filename 文件是否存在,存在为真,不存在为假 2 -d filename 判断是否存在且为目录 3 -f filename 判断是否为普通文件 -
例子
-
判断是文件夹是否为空
#! /bin/bash # 通过内置变量 count=`ls $1 | wc -l` [ ${count} -eq 0 ] echo "目录为空吗:$?"
#读取键盘录入的目录 read -p "请您输入一个目录:" mydir count=`ls ${mydir} | wc -l` [ ${count} -eq 0 ] echo "目录为空吗:$?"
-
八、数组
-
数组定义:
数组名=(值1 值2 ...)
-
查询数组
- 查询指定:
${数组名[索引]}
- 查询全部:
${数组名[* | @]}
- 查看长度:
${#数组名[*|@]}
- 查询指定:
-
修改数组:
数组名[索引]=新值
-
删除数组:
unset 数组名
九、函数
1、简单函数
1.定义函数:
function 函数名(){
语句
...
}
2.调用函数:
函数名
#!/bin/bash
fun01(){
echo "简单函数"
}
fun01
2、带参函数
-
调用函数时,带参数
#!/bin/bash fun01(){ echo "带参函数: $1" } # 调用函数时,传入参数 fun01 "参数1"
-
执行脚本时,传入参数
#!/bin/bash fun01(){ echo "带参函数: $1 $2" } fun01 $1 $2
-
例子
#!/bin/bash read -p "请输入第一个数:" num1 read -p "请输入第二个数:" num2 # 声明函数 sum(){ num=$((num1+num2)) echo "两个数的和为:$num" } # 调用函数 sum
#! /bin/bash read -p "请您输入长方形的长:" long read -p "请您输入长方形的宽:" width #编写周长 getPerimeter(){ length=$(((long + width) * 2 )) } getArea(){ area=$((long * width )) } #调用函数 getPerimeter getArea echo "长方形的周长是:${length}" echo "长方形的面积是:${area}"
十、if语句
-
格式1
说明:如果条件成立,则执行then后面语句,否则执行else后面语句 格式: if [ 条件 ] then 语句块 else 语句块 fi
-
格式2
格式: if [ 条件 ] then 语句块 elif [ 条件 ] then 语句块 elif [ 条件 ] then 语句块 ...... else 语句块 fi
-
单分支
#! /bin/bash read -p "请输入用户名" username read -p "请输入密码" password if [ $username == "admin" -a $password == "123456" ] then echo "登录成功" else echo "账号或密码有误" fi
-
判空输入
#! /bin/bash read -p "请输入一个值" value if [ -z $value ] then echo "您输入的数据是空的" elif [ -d $value ] then echo "您输入的数据是目录" elif [ -f $value ] then echo "您输入的数据是一般文件" else echo "数据有误" fi
十一、case语句
-
格式
条件符合执行相应的代码块,类似于if..elif..语句 格式: case 变量 in 值1 ) echo "语句块1" ;; 值2 ) echo "语句块2" ;; 值3 ) echo "语句块3" ;; ... * ) echo "语句块4-默认值" ;; esac 提示: 1. 星号(*)相当于else,条件都不符合时执行; 2. 双分号(;;)是必须的,执行完相应语句块跳出程序;
-
例子
#! /bin/bash read -p "请输入一个数字" num case $num in 1) echo "简单";; 2) echo "一般";; 3) echo "困难";; *) echo "数据有误";; esac
-
取值范围为列表
#! /bin/bash read -p "请输入一个商品代号" myscore case $myscore in [0-3]) echo "不满意";; [4-6]) echo "满意";; [7-9]) echo "非常满意";; *) echo "数据有误";; esac
十二、for循环
-
格式
遍历读取列表元素,列表元素遍历完毕,结束语句; 语法格式: for 值 in 列表 do 执行语句 done
-
1-100整数和
#! /bin/bash sum=0 for ele in `seq 100` do sum=$(($sum+$ele)) done echo "1-100之间的和为:${sum}"
注意:
- 遍历一组数据时,这组数据的实现方案:
- 格式1: 参数1 参数2 参数3 …
- 格式2: seq 命令
- seq N == 获取 [1-N] 之间的所有整数
- seq N1 N2 == 获取 [N1-N2]之间的所有整数
- seq N1 N2 N3 == 获取[N1-N3] 之间的正式,每次获取时都在上一个数字的基础之上 +N2(默认 +1)
十三、while循环
-
格式
说明:只要条件满足,就一直循环 while [ 条件 ] do 执行语句 done 提示: 1. 条件的类型:命令、字符串表达式、数字表达式 2. 中括号内前后有空格
-
求1-100的整数和
#! /bin/bash sum=0 num=1 while [ $num -le 100 ] do sum=$(($sum + $num)) num=$(($num + 1)) done echo "sum=${sum}"