开始学习shell
- 运行shell脚本有两种方法:
- 作为可执行程序,假如在某个目录下,编写了一个shell脚本test.sh,想要执行这个脚本,就需要先cd进入脚本所在目录,
chmod +x ./test.sh # 是脚本具有执行权限
./test.sh #执行脚本注意一定要写成 ./test.sh,而不是 test.sh。运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
- 作为解释器参数: 直接运行解释器,其参数就是shell脚本文件名,比如
/bin/sh test.sh
/bin/php test.php - shell变量:
注意: 变量名和等号之间不能有空格。定义变量时,变量名不加美元符号。name="Bob"。使用一个定义过的变量,只要在变量名前面加美元符号即可,echo $name。或echo ${name}。变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,重新赋值变量的时候也不加$。
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。(可简单理解为常量,但有不一样的地方)myUrl="http://www.google.com"
readonly myUrl删除变量unset name ,unset 和 readonly 操作变量的时候,也是不加$, 但要注意, unset 不能删除删除 只读变量
- 变量类型:局部变量、环境变量、shell变量。
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。 - 单引号和双引号:
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3 输出:
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
//当双引号或单引号成对使用的时候, 就是连接字符串,在PHP中需要使用 . 来连接, 而shell不需要加 . 其他的和PHP类似,双引号可以解析变量, 单引号做不到。 - 传递参数: 在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n是数字. $0 代表的是文件名, $1....$n代表的是第一个参数到第n个参数.
- 几个特殊字符用来处理参数
- $# 表示传递了几个参数;
- $* 表示以一个单字符串显示所有向脚本传递的参数。
- $$ 表示脚本运行的当前进程ID号
- $@ 和$*都是以单字符串显示所有向脚本传递的参数, 在不加引号的情况下
- $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
- $! 后台运行的最后一个进程的ID号
- 变量定义的时候,加引号和不加引号的区别:
- 使用单引号的情况下,不管里面的是否有变量或者其他的表达是都是原样子输出;
- 使用双引号,如果内容中有命令(要反引下)、变量、特殊转义符等,会先把变量、命令、转义字符解析出结果,然后再输出最终内容;
- 不使用引号,赋值时,如果变量内容中有空格,则会造成赋值不完整。而在输出内容时,会将含有空格的字符串视为一个整体来输出;如果内容中有命令(要反引下)、变量等,则会先把变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,则有可能无法完整地输出,因此需要双引号替代无引号的情况,特别是对变量赋值时改加双引号。一般连续的字符串、数字、路径等可以不加任何引号进行赋值和输出。
- 使用反引号:一般用于引用命令,执行的时候命令会被执行
#!/bin/sh
c=c1 c2 c3; #赋值时中间有空格
echo $c; #报错, c2: command not found
# 加上引号就会把上面的赋值内容当成一个整体
c='c1 c2 c3';
echo $c; # 正常输出 c1 c2 c3
#在输出的时候有空格, 会正常输出, 例如
echo b1 b2 b3; #输出 b1 b2 b3
echo b1b2b3; #输出 b1b2b3
- 原生bash不支持简单的数学运算, 需要使用expr, var=`expr 2 + 2` 注意表达式和运算符之间要有空格,且使用反引号。判断相等与不等:[ $a == $b ] 返回 false。[ $a != $b ] 返回 true。同样注意空格不要忘记。乘法需要注意一下:
val=`expr $a \* $b`
echo "a * b : $val"
# 必须使用 \ 才能实现乘法 - 关系运算符
#!/bin/sh
a=
b= if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi - 数组: shell只支持一维数组, 没有多维数组. Shell 数组用括号来表示,元素用"空格"符号分割开
a=(a0, a1 a2 a3 , a4)
echo ${a[@]} #输出全部元素 或者使用${a[*]} 也可以
#输出的是 a0, a1 a2 a3 , a4
#以空格作为分隔符, 逗号也是一个元素
#也可以使用下标定义数组
b[0]=b0;
b[1]=b1
echo ${b[@]} #输出 b0 b1读取数组使用${a[@]} 或者是使用${a[*]} 读取数组全部元素, 读取数组某个元素${a[n]} , n是数组下标, 读取数组时当数组没有这个值的时候, 并不会报错, 而是输出空值
#有这样几种情况: 假设定义了这样一个数组
a=(a0 a1 a2)
#. 使用数组名,不加下标的形式访问数组例如:
echo $a; #这种情况默认输出的是下标为0的元素, 如果没有定义下标为0的元素, 将会输出空值
#. 输出元素的时候,不加花括号:
echo $a[] #将会输出 a0[] , 如果想要输出指定下标的元素, 必须加上花括号 echo ${a[]}获取数组长度: ${#a[@]} 或者 ${#a[*]} 获取数组里元素的个数, 如果是指定下标, 则获取下标对应的元素值的长度, 例如
a[]=user0
echo ${#a[]} #将会输出
echo ${#a[@]} #输出 数组中只有一个元素,
echo ${#a[1]} #输出 0 因为没有下标为1 的元素值备注: 在Ubuntu系统中使用shell, 第一次编辑.sh文件时, 出现不能编辑, 删除等情况, 使用末行模式, 在末行模式下, 输入set nocompatible 回车, 然后再进入编辑模式. 把set nocompatible这个设置放到~/.vimrc里让它永久生效. 或者安装一个vim编辑器.
开始学习shell的更多相关文章
- 学习 shell脚本之前的基础知识
转载自:http://www.92csz.com/study/linux/12.htm 学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写sh ...
- Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程
Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...
- 学习Shell脚本编程(第2期)_编写修改权限及执行Shell程序的步骤
编写Shell程序 执行Shell程序 Shell程序有很多类似C语言和其他程序设计语言的特征,但是又没有程序语言那样复杂.Shell程序是指放在一个文件中的一系列Linux命令和实用程序.在执行的时 ...
- 第十三章、学习 Shell Scripts
什么是 Shell scripts shell script (程序化脚本) :shell script 是针对 shell 所写的『脚本!』 shell script 是利用 shell 的功能所写 ...
- 菜鸟教程之学习Shell script笔记(上)
菜鸟教程之学习Shell script笔记 以下内容是,学习菜鸟shell教程整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.ht ...
- 鸟哥的Linux私房菜——第十六章:学习Shell Scripts
视频链接:http://www.bilibili.com/video/av10565321/ 1. 什么是 Shell Script (shell写的脚本)1.1 干嘛学习 shell s ...
- 学习shell脚本之前的基础知识
日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目.有的单位 ...
- (转)跟着老男孩一步步学习Shell高级编程实战
原文:http://oldboy.blog.51cto.com/2561410/1264627/ 跟着老男孩一步步学习Shell高级编程实战 原创作品,允许转载,转载时请务必以超链接形式标明文章 原 ...
- 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)
第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...
- 跟着老男孩一步步学习Shell高级编程实战
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1264627 本sh ...
随机推荐
- 阿里云ECS云服务器CentOS部署个人网站
ping了一下coding pages和阿里云服务器的速度,意外感觉coding的速度反而更快.不过为了折腾,还是把博客迁移到阿里云,跌跌撞撞遇到很多坑,大多是由于对指令不熟悉以及部分教程省略了部分步 ...
- redis发布订阅者
发布者pub.py import redis conn = redis.Redis(host='127.0.0.1', decode_responses=True) conn.publish(') 订 ...
- 电脑主板插线方法图解_JFP1主板插线图解
电脑主板插线方法图解_JFP1主板插线图 仔细看主板上有对应的英文标识的,一对一插就行分别是电源,复位,硬盘灯,电源灯的负极,正极
- LinqToSQL3
Lambda Lambda表达式和匿名方法很相似,但Lambda表达式比匿名方法更灵活,并且语法比匿名方法更简洁. 在LINQ中可以使用Lambda表达式创建委托,这些委托将稍后执行查询时被调用. L ...
- vue-cli3配置eslint
一.默认配置 以下是package.json文件中关于的eslint默认配置 "eslintConfig": { "root": true, "env ...
- 1 c# 获取当前正在运行的类的程序集
public static Assembly CurrentAssembly { get { return Assembly.GetExecutingAssembly(); } }
- javaScript基础题
1.介绍JavaScript的基本数据类型 Number.Boolean.String.underfind.null Object是JavaScript中所有对象的父对象 数据封装类对象:Object ...
- Line 算法与deepwalk的对比 和个人理解
用户的关注关系本身就是一个图结构,要从用户关注关系生成用户的embedding表示,其实就是做graph的emebding表示. deepwalk+word2vec 比较简单,效果也还可以.这种方法再 ...
- Oracle【多表查询操作(SQL92&SQL99)】
多表联合查询:需要获取的数据分布在多张表中 SQL92: --笛卡尔积:将多个表的数据进行一一对应,所得的结果为多表的笛卡尔积 select * from emp; select * from dep ...
- (十)全志R18 Tina平台关闭所有串口打印的方法
全志R18 Tina平台关闭所有打印输出方法: 有些国外的产品安全认证,如亚马逊Alexa认证,认证机构会不停地点pcb上的点,看有没有东西输出,有的话就通过这些口想办法破解设备,所以安全认证会要求设 ...