shell脚本基础
来源:互联网 发布:互联网医院 知乎 编辑:程序博客网 时间:2024/06/09 14:55
Shell简介
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本,但shell 和 shell script 是两个不同的概念。
Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
- ……
第一个shell脚本-----test.sh
#!/bin/bashecho "Hello world !"
文件的扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意即可。#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
运行 Shell 脚本有两种方法:
1、作为可执行程序
将上面的代码保存为 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中只有单行注释,没有多行注释。
2、作为解释器参数
直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh这种方式运行的脚本,不需要在第一行指定解释器信息,写了也不会起到任何作用。
chmod +x file ,为脚本加上执行权限,否则会提示无执行权限
执行脚本时候或者全目录,或者 ./file.sh ,如果不加的话,linux 默认会从PATH 里去找该 file.sh。
Shell 变量
定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name="runoob.com"
变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:
- 首个字符必须为字母(a-z,A-Z)。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="zhouDS"echo $your_nameecho ${your_name} #花括号是可选的,主要用来识别变量的边界your_name="zhouSM" #重新定义变量readonly ${your_name} #只读变量unset your_name #删除变量
变量类型
运行shell时,会同时存在三种变量:
- 1) 局部变量局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 2) 环境变量所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- 3) shell变量shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
Shell 字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
your_name='qinjx'str="Hello, I know your are \"$your_name\"! \n" #字符串拼接
单引号字符串的特点:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
字符串操作:
string="abcd"echo ${#string} #获取字符串长度,输出 4
string="runoob is a great site"echo ${string:1:4} #提取字符串,第 2 个字符开始截取 4 个字符,输出 unoo
string="runoob is a great company"echo `expr index "$string" is` #查找字符 "i 或 s" 的位置,输出 8
Shell 数组
数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。
与大部分编程语言类似,数组元素的下标由0开始。
Shell 数组用括号来表示,元素用"空格"符号分割开:
array_name=(value1 ... valuen)
或
array_name[0]=value0array_name[1]=value1
数组操作:
array_value1=${array_name[index]} #读取数组元素,index代表数组元素下标array_values=${array_name[@]} #读取数组中所有元素,在这里 @ 和 * 有相同的效果。都可以获取数组中所有元素。array_length=${#array_name[@]} #获取数组长度, @ 可以用 * 代替
Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,0 为执行的文件名,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……另外,还有几个特殊字符用来处理参数:
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。$$脚本运行的当前进程ID号$!后台运行的最后一个进程的ID号$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。$-显示Shell使用的当前选项,与set命令功能相同。$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
$* 与 $@ 区别:
- 相同点:都是引用所有参数。
- 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
Shell 基本运算符
Shell 和其他编程语言一样,支持多种运算符,包括:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
例如:
#!/bin/bashval=`expr 2 + 2` #使用的是反引号,而不是单引号,且数字和运算符之间有空格echo "两数之和为 : $val"
两点注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。
- 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,而是在 Esc 键下边的反引号。
算术运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成[ $a == $b ]。
乘法 * 需要用转义字符 \*,在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
注:
EQ 就是 EQUAL等于
NQ 就是 NOT EQUAL不等于
GT 就是 GREATER THAN大于
LT 就是 LESS THAN小于
GE 就是 GREATER THAN OR EQUAL 大于等于
LE 就是 LESS THAN OR EQUAL 小于等于
布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
- Linux Shell脚本基础
- Linux Shell脚本基础
- Shell脚本编程基础
- Shell脚本编程基础
- shell脚本基础
- shell脚本基础
- shell脚本基础
- shell脚本基础
- Shell脚本编程基础
- shell 脚本基础学习
- shell脚本基础语法
- Linux shell脚本基础
- Shell脚本基础
- shell脚本基础
- Linux shell脚本基础
- Shell脚本基础总结
- shell脚本基础
- Shell脚本基础介绍
- 6.7-3求链表倒数第n项
- HttpClient4.X 解决POST请求返回重定向问题
- nginx服务器高并发优化思路
- Spark体系概况
- springboot报错(三) webjars被拦截或找不到
- shell脚本基础
- 100. Same Tree (DFS)
- 以sqlserver处理父子级关系查询为列介绍with as、cast()、for xml path()、stuff()的使用
- CentOs7 自动获取IP地址图文详解
- 《Python核心编程习题》---chapte11
- 悬浮框计算器
- 日常小结篇-static/final
- JS实现的base64加密、md5加密及sha1加密详解
- 严重: Exception sending context initialized event to listener instance of class [org.springframework.w