概述
Shell是一个命令行解释器,是Linux系统用户与内核交互的一个桥梁。Shell脚本是shell命令的有序集合,将shell命令放在一个文件中,这个文件就是shell脚本。shell不仅可以执行简单的命令语法,还能执行复杂的逻辑语法。
本文使用Ubuntu系统学习shell脚本,该系统使用的shell版本为bash。
创建一个shell脚本
vi test.sh
shell脚本是一种解释性语言,所以不需要编译
注释
#这是单行注释
:<<"EOF"
这是多行注释
这是多行注释
EOF
运行shell脚本
①
#直接运行可能没有权限,先给权限
chmod 0777 test.sh
./test.sh
②
bash test.sh
③
source test.sh
三种运行shell脚本方式的区别:
./test.sh 和 bash test.sh #运行时会创建一个子终端运行,再把运行结果返回给当前终端;
source #在当前终端运行,一般用来让脚本生效;
Shell变量
shell变量的使用
1.变量命名 字母数字下划线不以数字开头
2.变量不需要定义,直接使用
3.变量前面不需要数据类型
4.变量名一般见名知意
5.变量赋值时等号两边不能有空格
6.一句命令不需要分号隔开
7.变量保存的内容都默认为字符串
#变量的引用
$var
${var}
#变量的重新赋值
var=hello
var=world //不能写成 $var=word (相当于把world赋值给hello) 出错
#变量的追加赋值
var=hello
var="$var world"
#取消变量的赋值
unset var
echo命令
echo str #输出自动换行
echo -n str #输出不换行
echo -e "n str" #-e开启解释转义字符 默认-E 关闭
命令置换
#命令置换相当于把一个命令的结果赋值给一个变量
#方式1:
ret=`ls`#[反引号] (不会输出ls结果,只是把其结果赋值给ret)
#方式2:
ret=$(ls)
#把命令置换的结果赋值给命令行参数
set ${ret}
位置变量
#命令行参数:
$0 $1 $2 $3 ...... ${10}
#bash执行 $0 为脚本文件名
#source执行 $0 为 bash
$* #全部命令行参数(不包括文件名)
$# #命令行参数的个数(不包括文件名)
$$ #该进程的进程号
字符串的处理
#字符串的拷贝
str1=hello
str2=world
str1=$str2
#字符串的连接
str1=hello
str2=world
str1="$str1$str2"
#字符串长度
${#str}
提取字符串
#设str为
str="www.baidu.combaidu.combaidu.com"
#方式1:
${str:start:len}
从 start (0开始计)开始,提取 len 个字符
eg:
echo ${str:4:5} //baidu
#方式2:
${str:start}
从 start 开始提取右边 所有 字符
eg:
echo ${str:4} //baidu.combaidu.combaidu.com
#方式3:
${str:0-start:len}
从 右往左 数到 start,取start后len个字符 右是从1开始
eg:
echo ${str:0-10:5} //mbaid
#方式4:
${str:0-start}
从 右往左 数到 start,取start后所有字符
eg:
echo ${str:0-10} //mbaidu.com
#方式5:
${str#*sub}
从 左往右 搜索 第一次 出现sub的位置,输出 sub后 的所有内容
eg:
echo ${str#*sub} //du.combaidu.combaidu.com
#方式6:
${str##*sub}
从 左往右 搜索 最后一次 出现sub的位置,输出 sub后 的所有内容
eg:
echo ${str##*sub} //du.com
#方式7:
${str%sub*}
从 右往左 搜索 第一次 出现sub的位置,输出sub 前面 的所有内容
eg:
echo ${str%sub*} //www.baidu.combaidu.com
#方式8:
${str%%sub*}
从 右往左 搜索 最后一次 出现sub的位置,输出sub 前面 的所有内容
eg:
echo ${str%%sub*} //www.
数组
Shell 只支持一维数组,成员都是字符串
#数组的初始化
arr=(1 2 3 4 "hello world" aa bb cc)
#或者
#不按照元素下标顺序赋值
arr=([0]=100 [3]=300 [5]="hello v"
#注意 没有被赋值的为 空
#数组的引用
${arr[0]} ${arr[1]} ......
#修改元素的值:
arr[3]=aa
#访问数组所有内容:
${arr[*]} 或者 ${arr[@]}
#数组的大小 是一个数组被赋值的元素的个数
${#arr[*]} 或者 ${#arr[@]}
#数组添加元素
*添加元素 数组 会重新排列,有空格的会被分开*
*若是跳跃赋值,那么重新排列以后下标会重新赋值*
eg:
arr=([0]=a [3]=[b] [5]=c)
arr=(${arr[*]} "hello world")
arr=$arr{arr[*]}
结 果 为 a b c "hello world"
下标依次为 0 1 2 3
#末尾添加:
arr=(${arr[@]} "AAA")
#开头添加:
arr=("bbb" ${arr[@]})
#清空数组
unset arr #清空着整个数组
unset arr[下标] #清空某个元素
read 命令行输入
1.read var
2.read var1 var2
#从终端输入两个变量,以第一个空格作为分割分别赋给两个变量
3.read -p "提示语句" <变量名>
4.read -a <数组名> #(以 空格 作为每个元素的分隔)
5.read -n num <变量名> #当输入的字符个数等于 num 就自动结束输入
6.read -s <变量名> #静默输入(没有回显)
7.read -t <单位秒> #限制在单位秒内输完,超时自动结束
Shell变量的运算
shell变量保存的是字符串所以不能常规性的进行运算,需要借助特殊符号
+ - * / += -= *= /=
** 幂运算
&& || !
& | ~
> < >= <= ==
(( ))
1.支持整数运算
2.(()) 里面引用变量的值的时候可加$,可不加
((var += $var))
((var++))
3.可以把 $((表达式))赋值给一个变量
4.(())可以像C语言进行复杂运算
5.&? 判断上一句代码的执行情况,成功返回0,失败返回1
6.((表达式1,表达式2,表达式3......))
#执行结果为最后一个表达式的值
$[]
1.支持整数运算
2.必须要把结果赋给一个变量
3.引用变量的值的时候可以加$也可以不加
4. ret=$[表达式1,表达式2,表达式3]
#执行表达式3的结果
5.支持幂运算
expr
1.既能进行整数运算,也能操作字符串
2.在引用变量的时候一定要加 $
3.expr 在使用时要加空格
4.可以直接输出结果到终端
5.不支持一些如 += -= 的复合运算,不支持幂运算
6.在做 * > < 时需要加转义字符
7.在赋值时需要 命令置换
①匹配字符串
expr match $str1 "str2"
比较str1和str2,遇不同结束,返回相同的个数
*特殊情况**str1不小于str2**有空格要加双引号 都要加*
②字符串的截取
expr substr "$str" start len
从(0开始)start个数开始 截取 len 个字符
③字符串长度
expr length "$str" //若str中有空格 要加双引号
(echo ${#str})
④查找子串
expr index "$str" "sub"
若找到字串,那么值为第一次出现子串的位置(零开始数)
最后
以上就是饱满煎饼为你收集整理的Linux基础 03 - Shell脚本的全部内容,希望文章能够帮你解决Linux基础 03 - Shell脚本所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复