shell 学习(一)
#! 表示约定的标记,他会告诉系统这个脚本需要什么样的解释器来执行,即是一种脚本的体现。
#!/bin/bash 定义文件申明
echo "hello world"
ls -l ShellHello.sh 查看权限 -rwxr-xr-x
chmod +x ./ShellHello.sh 修改文件权限
./ShellHello.sh 执行
执行:./
表示命令用于输出文本信息:echo
输出变量:${}
查看权限:ls -l
修改文件权限:chmod +x ./文件名
# 注释 没有多注释
变量的定义:
注意1:定义变量的时候,变量的名称不需要加$符号
注意2:变量名和等号不能有空格(和一般语言不一样)
注意3:变量名必须是字母 ( a-z A-Z)+下划线
注意4:变量名中间不能有空格
注意5:不允许使用标点符号
只读变量: 类似常量
关键字:readonly 只读不能修改
删除变量
语法:unset
案例 unset name
变量类型
类型1:本地变量
作用域整个bash进程可以使用
语法:name="lsg"
类型2:局部变量
作用域:当前代码段(修饰:local)
local name="lsg2"
类型3:环境变量 -> 相当于静态变量
作用域:当前shell进程以及子进程
语法:export name="lsg3" [export 导出]
类型4:位置变量
案例脚本代码:
name=${0}
age=${1}
sex=${2}
echo $name \n
echo $age \n
echo $sex \n
echo "姓名:${name} - 年龄:${age} - 性别:${sex}"
${0}表示脚本名称 所以不要用${0}这个变量
参数从1开始
特殊变量
${0}->特殊变量->文件名称
${?}->表示返回上一个命令执行状态的返回值
返回0表示执行成功
返回1程序执行的结果
返回2表示程序状态返回码(0-255)
系统的预留错误 (1、2、127)
案例:
sex=${3}
echo ${?}
不要加括号也可以
$#->参数个数
$*->参数列表
$@->参数列表
$$->获取当前shell进程ID
$!->执行上一个指令PID
$@和$*有区别
echo $*
echo $@
执行脚本
./ShellHello.sh lsg 200 男
脚本结果
${*}->参数列表:将所有的参数组成一个字符串
${@}->参数列表:分开的->"lsg" 200 将参数一个一个分开
字符串:
单引号 name='lsg' echo ${name}
双引号 name="lsg" echo ${name}
字符串拼接
第一中方式:
naem="lsg"
sex="男"
info="${name}${sex}" 拼接
echo $info
第二中方式:
naem="lsg"
sex="男"
info="姓名"${name}" 性别:"${sex}" " 拼接
echo $info
获取字符串长度 在变量名加# ->${#name}
name="lsg"
echo ${#name}
字符串截取
语法:${变量名:开始位置:截取长度}
案例一:
name="i have Dreame"
从字符串第三个开始截取,截取3个 截取的下标从0开始
result=${name:2:3}
echo ${result}
案例二:
从字符串第5开始截取,到最后一个结束
方式1:
name="i have Dreame"
length=${#name}
result=${name:2:length-1}
echo ${result}
方式2:
name="i have Dreame"
result=${name:5}
echo ${result}
字符串删除
语法1:${变量名#删除的字符串 正则表达式}
作用:从字符串开头(左边)开始匹配要删除的字符
案例1:匹配不到(错误)
name="i have Dreame"
result=${name#Dreame}
echo ${result}
案例2:从左到右 下面这个可以删除
name="i have Dreame"
result=${name#i}
echo ${result}
案例3:查找指定字符第一个,并且删除前面所有的字符包含自己
name="i have Dreame"
result=${name#*D}删除D 前面所有的字符包含自己 (从左到右匹配)
echo ${result}
案例4:指定删除的范围
name="i have Dreame"
result=${name#i*D} 从i到D包含D都删除了(从左到右匹配)
echo ${result}
语法2:${变量名##删除的字符串 正则表达式}
作用:从开始删除指定的字符
案例1:
name="i have Dreame"
result=${name##*m}删除m之前的所有的字符包含m(从开始到m)
echo ${result}
总结:语法1和语法2从左边删除到右边,查找方向不一样
语法3:${变量名%删除的字符串 正则表达式}
作用:从字符串结尾开始匹配,删除的字符串
案例1:查找第一个字符
代码1:查不到
name="i have Dreame"
result=${name%a}
echo ${result}
代码2:
name="i have Dreame"
result=${name%e}可以删除 执行结果:删除e
echo ${result}
案例2:查找指定字符第一个,并且删除前面所有字符(包含自己)
name="i have Dreame"
result=${name%h*}(用%h*删除*在右边->字符右边的包含自己都删除了。用#*h,也就是*在左边,字符左边的都被删除了包含自己)
echo ${result}
案例3:指定删除的范围
name="i have Dream"
result=${name%a*m}指定的范围必须是前面任意一个字符到最后字符 ,否则向${name%h*e}这种不起作用
echo ${result}
语法4:${变量名%%删除的字符串 正则表达式}
案例1:查找指定字符的最后一个,并且删除前面所有的字符(包含自己)
name="i have Dream"
result=${name%%a*}字符串里面有多个相同的字符就比如变量name里面的a 如果你用%%a*你就是从左到右删除,执行结果为(i h),如果%a*这样从右匹配,结果:(i have Dre)
echo ${result}
总结:
从左边删除到右边
#->表示查询方向从左到右
##->表示查询方向从右到左
从右边删除到左边
%->表示查询方向从右到左
%%->表示查询方向从左到右
替换字符串
str="apple, tree, apple tree apple"
echo ${str/apple/APPLE} # 替换第一次出现的apple
echo ${str//apple/APPLE} # 替换所有apple
echo ${str/#apple/APPLE} # 如果字符串str以apple开头,则用APPLE替换它
echo ${str/%apple/APPLE} # 如果字符串str以apple结尾,则用APPLE替换它