Shell概念
1、Shell壳
Shell是一个用C余元编写的程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
2、Shell脚本
是一种为shell编写的脚本程序,业界所说的shell通常是指shell脚本。
shell和shell script是两个不同的概念
Shell环境
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程序步骤
1.创建一个文件,扩展名为.sh
2.修改文件的权限为可执行文件
3.执行
Shell结构
1.#! 用来指定执行的脚本的shell
2.# 注释
3.命令和控制结构
Shell变量
一、命名规则
1.命名只能使用字母、数字、下划线,不能以数字开头
2.中间不能有空格
3.不能使用标点符号
4.不能使用bash的关键字
二、使用规则
1.习惯用大写字母来命名变量
2.赋值时,"="前后不能有空格
3.命令的执行结果赋值给变量时,使用反单引号如TIME=`date`
4.使用变量时(引用变量时)使用 $变量名 或 ${变量名}
5.只读变量
使用readonly。此命令可以将变量定义为只读变量,只读变量的值不能被改变
6.删除变量
使用unset。变量删除后不能再次被使用,unset不能删除只读命令
三、变量的类型
1.临时变量:也叫局部变量,在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
2.永久变量:也叫环境变量,所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
Shell字符串
一、字符串
1.是shell编程中最常用和最有用的数据类型
2.字符串可以用单引号,也可以使用双引号,还可以不需要引号
3.单引号:
a.单引号里的任何字符串都会原样输出,单引号字符串中的变量是无效的
b.单引号字符串中不能出现单引号(使用转义符号也不行)
4.双引号:
a.双引号内可以有变量
b.双引号内可以出现转义字符
二、字符串拼接
1.无缝拼接
2.双引号内直接使用变量
三、获取字符串长度
1.${#name}
2.expr length ${name}
四、提取子字符串
1.${name:startIndex:length}
2.${name:startIndex}
3.${name:0-index:length}
4.${name:0-index}
*:还可以使用#、##、%、%%进行删除后保留的子串
#、##:从左边开始删除
#表示从左边删除到第一字指定的字符
##表示从左边删除到最后一个指定的字符
%、%%:从右边开始删除
%表示从右边删除到第一个指定的字符
%%表示从右边删除到最后一个指定的字符
*:删除包括指定的自身
五、子字符串查找
url="this is a good man"
index=`exper index "${url}" is`
echo $index -----2
Shell数组
一、使用规则
1.Bash仅仅支持一维数组,并且没有限定数组的大小。
2.数组元素的下标从0开始。
3.获取数组中的元素要利用下标,
4.下标使用不当,会报错。
二、定义数组
1. arrayName=(值1 值2 … 值n)
2. arrayName=( 值1
值2
..
值n)
注意:元素间使用空格分隔开或者换行符
3. 或者直接定义数组的各个元素
name[0]=值1
name[1]=值2
…
name[n]=值n
三、读取数组
格式:${name[index]}
四、获取数组所有元素
格式:${name[*]} 或${name[@]}
五、获取数组长度
格式: ${#name[*]}或${#name[@]}
位置变量和特殊变量
Shell解释用户执行的命令时,会将命令行的一串字符进行解析划分成部分。每个部分都有一个固定的变量名$n,不能自定义。
$n: n从0开始,依次往后+1。从$1开始 叫位置参数变量。大于等于10时,必须使用{}将数字括起来
Ex:ls –la file1 file2 file3 ….. file10
$0 的值为:ls -la
$1 的值为file1
…….
${10} 的值为file10
变量名称 | 意义 |
$* | 获取所有的参数,合并成一个字符串 |
$# | 获取参数的个数 |
$$ | 获取当前进程的ID |
$! | 获取后台运行的最后一个进程的ID |
$? | 显示最后一个命令的退出状态,0表示没有错误 |
Shell命令
一、read命令(从键盘读取数据,赋值给变量)
Ex: read username
*:当输入的词组个数大于需要的参数个数,则多出的词组将被作为整体为最后一个参数接收。
Ex: read –p “请输入密码:” –n 6 -t 5 password
echo -e “\npassword is $password”
参数说明:
-p:输出提示文字
-n 输入字符串长度,达到此长度,自动结束
-t 输入限制时间
-s 隐藏输入内容
二、expr命令(对整数型变量进行算术运算)
Ex: expr 3 + 5
expr 3 \* 5
复杂计算:expr ` expr 5 - 1` / 2
num=` expr $var / 2`
三、echo命令(用于字符串的输出显示)
echo $var
echo It is a test file
开启转义 : -e
echo -e “ hello \n world”
echo -e “hellokitty \c”
\n #换行
\c #不换行
四、printf命令
与echo功能相同,用来输出,功能更强大,如格式化字符串,指定字符串的宽度,左右对齐方式,默认不换行,可以手动添加\n
语法:printf format-string [arguments……...]
说明:
format-string: 格式控制字符串
arguments: 参数值列表
%d %s %c %f 格式替代符详解:
d: Decimal 十进制整数 -- 对应位置参数必须是十进制整数,否则报错!
s: String 字符串 -- 对应位置参数必须是字符串或者字符型,否则报错!
c: Char 字符 -- 对应位置参数必须是字符串或者字符型,否则报错!
f: Float 浮点 -- 对应位置参数必须是数字型,否则报错!
Ex:
printf “HelloWorld” #不会换行
printf “HelloWorld\n” #才会换行
printf “%-20s %-16s %-8s\n” 姓名 性别 体重kg
printf “%-20s %-16s %-8.2s\n” 张三 男 45.1234kg
printf “%-20s %-16s %-8.2s\n” 李四 男 76.5678kg
printf “%-20s %-16s %-8.2s\n” 王五 女 40.6543kg
Ex:
printf “%d %s\n” 1 “abc”
printf %s abcdef
printf %s abc def #此格式只指定了一个参数,但是多出的参数仍然会按照该格式输出,格式被重用
printf “%s %s %s\n” a b c d e f g h I j
printf “%s and %d” #没有参数时,%s为空,%d为0
转义序列 | 意义 |
\b | 退格 |
\f | 换页显示 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 转义斜杠 |
五、test命令(用于测试变量是否相等、是否为空、文件类型等)
格式:test 测试条件
测试范围:整数测试,字符串测试,文件测试
整数测试
test v1 -eq v2 测试两个数是否相等
test v1 -gt v2 测试是否 v1>v2
test v1 -ge v2 测试是否 v1>=v2
test v1 -lt v2 测试是否 v1<v2
test v1 -le v2 测试是否 v1<=v2
test v1 -ne v2 测试两个数是否不相等
字符串测试
test str1=str2 测试字符串是否相等
test str1!= str2 测试字符串是否不相等
test str1 测试字符串是否不为空
test -n str1 测试字符串是否不为空
test -z str1 测试字符串是否为空
文件测试
test -d file 指定文件是否目录
test -f file 指定文件是否是常规文件
test -x file 指定文件是否可执行
test -r file 指定文件是否可读
test -w file 指定文件是否可写
test -a file 指定文件是否存在
test -s file 文件的大小是否非0
*:通常test命令不单独使用,而是与if语句连用