一、变量

shell变量的定义与其他语言并没有什么区别。主要注意一下几点

  1. shell变量没有赋值的时候。会被当做命令执行
  2. shell变量。可以是值。也可以是命令。可以是命令返回值,函数返回值。反正挺广泛的(泛型)。

1.1 变量类型

  1. 局部变量 当前脚本内部定义的变量。其他脚本不能访问
  2. 环境变量 所有程序都能方位的变量。比如PATH
  3. shell变量 由shell程序设置的特殊变量,可能是局部,也可能是环境(不是很懂。。)
  • shell脚本继承。貌似是不能继承局部变量。

1.2 变量使用

变量使用 一般使用变量:${变量名} 或者 $变量名 。推荐第一种。

当命令作为变量的时候 可以使用“``” 反引号内部添加变量名的方式。另外 $() 也可以。通常后一种适用于内部命令有操作的情况。例如

workspacePostFix=".xcworkspace"
file_a="/demo/demo.xcworkspace"
# grep 正则的用法。下面的这个命令。意思是打印出file_a 变量名.进行匹配,如果包含。则赋值给result 。如果不包含则赋值为空
result=$(echo $file_a | grep "${workspacePostFix}")
复制代码
  • shell变量赋值。=赋值符号两边不能有空格。

1.3 变量相关命令

  1. readonly 只读
#!/bin/bash
myUrl="http://www.w3cschool.cc"
readonly myUrl
myUrl="http://www.runoob.com"
复制代码
  1. unset 删除变量
#!/bin/sh
myUrl="http://www.runoob.com"
unset myUrl
echo $myUrl
复制代码

二、字符串

2.1 字符串定义

shell 中字符串定义可以是单引号,也可以用双引号

'字符串'
"字符串"
复制代码

区别在于

  1. 单引号字符串,就是字符串,不可更改
str='字符串'
复制代码
  1. 双引号字符串,可以赋值
str='字符串1'
str2="我是:${str}"
复制代码

2.2字符串截取

#1. # 号截取,删除左边字符,保留右边字符。
var=http://www.aaa.com/123.htm
echo ${var#*/}(其中 *为通配符,代表所有字符串,截取从“/”开始)
#2. ## 号截取,删除左边字符,保留右边字符。
echo ${var##*/}
#3. %号截取,删除右边字符,保留左边字符
echo ${var%/*}
#4. %% 号截取,删除右边字符,保留左边字符
echo ${var%%/*}
#5. 从左边第几个字符开始,及字符的个数
echo ${var:0:5}
#6. 从左边第几个字符开始,一直到结束。
echo ${var:7}
#7. 从右边第几个字符开始,及字符的个数
echo ${var:0-7:3}
#其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
#8. 从右边第几个字符开始,一直到结束。
echo ${var:0-7}
#表示从右边第七个字符开始,一直到结束。
复制代码

三、数组

shell中没有 key-value 类型的键值映射存储结构。一般存储都使用数组来完成

3.1 定义

用括号表示数组,用空格隔开。shell中只支持一维数组。不支持多维数组

array_name=(value1 valu2 valu3)
复制代码

3.2 数组赋值和读取

3.2.1 数组赋值

array_name=(value1 valu2 valu3)
array_name[0]=value4
复制代码

3.2.2 读取数组

valuen=${array_name[2]}
复制代码

3.2.3 获取数组长度

length=${array_name[@]}
length=${array_name[*]}
复制代码

3.2.4 获取数组单个元素长度

lengthn=${array_name[n]}
复制代码

3.2.5 获取数组总所有元素

${array_name[@]}
${array_name[*]}
复制代码

四、运算符

4.1常规运算

4.1.1 算数运算

与其他语言运算一致,唯一区别即,原生bash不支持算数运算,需要借助 awk 和expr两个命令完成。其中以expr最常用

va =`expr 2 + 2`
复制代码

注意,必须使用反引号` 而不是单引号;还有就是2 + 2 中间必须有空格 反引号 内部括起来的,是当做命令执行的,而且执行结果作为变量,比如

`pwd`

4.1.2 关系运算符

a=10 b=20

  • -eq 检测两个数是否相等 例: [$a -eq $b] false
  • -ne 检测两个数是否不相等 例 : [$a -ne $b] true
  • -gt 检测左边的数是否大于右边的数 例: [$a -gt $b] false
  • -lt 检测左边的数是否小于右边的数 例: [$a -lt $b] true
  • -ge 检测左边的数是否大于等于右边的数 例 : [$a -ge $b] false
  • -le 检测左边的数是否小于等于右边的数 例: [$a -le $b] true

4.1.3布尔运算符

  • ! 非
  • -o 或 [$a -lt 20 -o $b -gt 100]
  • -a 与 [$a -lt 20 -a $b -gt 100]

4.1.4 逻辑运算符

  • && 逻辑的 AND

[[ $a -lt 100 && $b -gt 100 ]] 返回 false

  • || 逻辑的 OR

[[ $a -lt 100 || $b -gt 100 ]] 返回 true

4.1.5字符串运算符

下表列出了常用的字符串运算符,假定变量

a="abc"

b="efg"

  • =检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
  • != 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
  • -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false
  • -n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。
  • str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

运算符详解见运算符详解

五、流程控制

流程控制,一般就包括 if 条件判断 for循环 while循环 case几种

5.1 if 条件判断

if 语法格式如下

if [条件代码]
then执行代码
fi
复制代码

举例说明

a=10
b=20
if [ $a == $b ]
thenecho "a 等于 b"
elif [ $a -gt $b ]
thenecho "a 大于 b"
elif [ $a -lt $b ]
thenecho "a 小于 b"
elseecho "没有符合的条件"
fi
复制代码
  • 另外 if条件判断中可能会涉及一个特殊命令 $?。这个命令代表 上个命令的退出状态,或函数的返回值。例如:
### diffchangeFile代表某个路径
open -a Xcode ${diffchangeFile}
###$?    上个命令的退出状态,或函数的返回值。
###例子1 :
###ls 命令没有找到匹配的结果. 所以返回2  $? 就是2
###
if [  $? != 0 ]
then
echo "*********打开失败**********"
open -a Xcode ${diffchangeFile}
fi
复制代码

5.2 for 循环

for循环语法格式如下

# loop 是变量
for loop in 1 2 3 4 5
doecho "The value is: $loop"
done#或者
array_name=("大神" "慢走" "请留步")for loop in ${array_name[@]};
doecho "*************${loop}****************"
done复制代码

5.3 while循环

while 语法格式如下

int=1
while(( $int<=5 ))
doecho $intlet "int++"
done
复制代码
  • 其中 (())是括号内部表示的
  • let 是shell中定义的命令。使用方式如下

自加操作:let no++

自减操作:let no--

简写形式 let no+=10,let no-=20

通常还可以使用 while做命令读取。 read 命令类似C 语言中scanf等待输入。例如:

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
doecho "是的!$FILM 是一个好网站"
done
#<CTRL-D> <CTRL-D> 为退出操作
复制代码

5.4 case

类似于 switch 功能.语法如下

case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;
esac
复制代码

举例说明

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in1)  echo '你选择了 1';;2)  echo '你选择了 2';;3)  echo '你选择了 3';;4)  echo '你选择了 4';;*)  echo '你没有输入 1 到 4 之间的数字';;
esac
复制代码

六、函数

函数定义和使用

shell 函数 定义方式如下

函数名(){}
复制代码

直接填写函数名可以调用函。不过如果函数没有对应的实现。会被当成命令来执行

shell 函数没有形参的概念。但是如果想获得函数的入参 可以通过 $n 获取。还能通过重定向 < 方式获得的

#定义函数
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
复制代码

还有几个特殊字符用来处理参数

$#    传递到脚本的参数个数
$*  以一个单字符串显示所有向脚本传递的参数
$$  脚本运行的当前进程ID号
$!  后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-  显示Shell使用的当前选项,与set命令功能相同。
$?  显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
复制代码

参考资料

http://www.runoob.com/linux/linux-shell.html https://www.cnblogs.com/OldJack/p/6602666.html

转载于:https://juejin.im/post/5ab87d90f265da23826df809

Shell基础学习笔记相关推荐

  1. Spark基础学习笔记16:创建RDD

    文章目录 零.本讲学习目标 一.RDD为何物 (一)RDD概念 (二)RDD示例 (三)RDD主要特征 二.做好准备工作 (一)准备文件 1.准备本地系统文件 2.准备HDFS系统文件 (二)启动Sp ...

  2. Spark基础学习笔记10:Scala集成开发环境

    文章目录 零.本讲学习目标 一.搭建Scala的Eclipse开发环境 (一)安装Scala插件 (二)创建Scala项目 二.搭建Scala的IntelliJ IDEA开发环境 (一)启动IDEA ...

  3. 小白的markdown基础学习笔记

    markdown基础学习笔记 1.代码块与代码区块 // 代码块语法: ​```java ​```shell // 代码区块语法: `print(hello world)` print(hello w ...

  4. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  5. Android编译及编译脚本、Android构建基础学习笔记

    Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...

  6. 《Linux Shell编程学习笔记之一》

    <Linux Shell编程学习笔记之一> 前言 由于自己一直在Windows上面编程,用linux用的比较少,学习linux还是本科大二学的一点点知识.因此自己就准备花点时间来熟悉下li ...

  7. Linux Shell编程学习笔记(4)

    Linux Shell编程学习笔记(2015-7-20) 分类:linux shell   今天学习了Linux Shell中的控制结构.其实大多数语言的控制结构这一块都是基本类似的,有了C语言的基础 ...

  8. guido正式发布python年份_Python 基础学习笔记.docx

    Python 基础学习笔记 基于<Python语言程序设计基础(第2版)> 第一部分 初识Python语言 第1章 程序设计基本方法 1.1 计算机的概念 计算机是根据指令操作数据的设备, ...

  9. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

    http://blog.jobbole.com/85008/ ASP.Net MVC开发基础学习笔记(5):区域.模板页与WebAPI初步 2015/03/17 · IT技术 · .Net, Asp. ...

最新文章

  1. html中base标签的使用,和简介
  2. 开发中最基本的对数据的增删改查SQL
  3. java技术栈有哪些_Java程序员必备的21个核心技术,你都掌握了哪些?
  4. 性能优化实战|使用eBPF代替iptables优化服务网格数据面性能
  5. JS中深浅拷贝 函数封装代码
  6. 找不到FLANNConfig.cmake文件
  7. 使用iPhone配置实用工具编辑APN设…
  8. 易接SDK接入:Android手游支付功能接口实现,完整代码奉上
  9. Android改机 安卓改机软件 免root/不刷机/拒绝Xposed 实现 技术分析
  10. 【科大讯飞Face】
  11. c语言的内部名和外部名,C语言 external
  12. chatgpt的150个指令大全
  13. type_traits 类型萃取
  14. Psins代码解析之线性误差模型精度验证(test_SINS_error_model_verify.m)
  15. 统计建模与R软件-附R原程序
  16. css扇子展开,CSS3 绝妙的扇形折叠展开加载动画
  17. #榜样的力量#思必驰疫情防控机器人丨数据猿新冠战“疫”公益策划
  18. 小明身高1.75,体重80.5kg。请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数给出对应的提示信息
  19. 专业化本地项目管理软件-project提供下载
  20. 前端扑街仔的nginx配置

热门文章

  1. font-family字体总结
  2. Eclipse启动时DDMS files not found: D:\Eclipse\adt-bundle-windows-x86_64-20131030\sdk\tool
  3. android onTouch()与onTouchEvent()的区别
  4. python 教程 第十三章、 特殊的方法
  5. gcc与gdb,函数小结
  6. 猫头鹰的深夜翻译:在JVM上根据合约编程
  7. 硬件常见问题及排错思路。
  8. 跟我一起学extjs5(05--主界面上增加顶部和底部区域)
  9. Qt使用教程:使用Qt Quick UI表单(五)
  10. AgileEAS.NET平台开发实例-药店系统-报表开发(上)