Shell脚本
Shell脚本
Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell即是一种命令语言,又是一种程序设计语言。
Shell是指一种应用程序,这个应用程序提供一个界面,用户通过这个界面访问操作系统内核的服务。
Shell脚本(shell script),是一种为shell编写的脚步程序。
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脚本
第一个Shell脚本
#!/bin/bash
或者
#!/bin/sh
echo "Hello World !"
#!:是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。
echo:用于向窗口输出文本。
运行Shell脚本的两种方法:
- 作为可执行程序
chmod +x ./test.sh # 使脚本具有执行权限
./test.sh # 执行脚本
- 作为解释器参数
这种运行方式,直接运行解释器,其参数就是shell脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php
Shell变量
定义变量
在Shell编程中,变量是用于存储数据值的名称。
注:变量名和等号之间不能有空格
命名规则:
- 只包含字母、数字和下划线
- 不能以数字开头
- 避免使用Shell关键字
- 使用大写字母表示常量
- 避免使用特殊符号
- 避免使用空格
# 有效变量
your_name="runoob"
_val="123"
PATH="/bin/"
[!Note]
反撇号:引用里面那个命令或脚本的输出结果
使用变量:
使用一个定义过的变量,只要在变量名前面加美元符号即可。
变量名外面的花括号为可选
加花括号是为了帮助解释器识别变量的边界
your_name="qinjx"
echo $your_name
echo ${your_name}
echo "My name is ${your}name"
只读变量
使用
readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。
#!/bin/bash
myurl="https://www.google.com"
readonly myurl
myurl="https://www.runoob.com" # 错误
删除变量
使用
unset命令可以删除变量.变量被删除后不能再次使用。
unset命令不能删除只读变量
unset variable_name
变量类型
- 字符串变量
在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} !
---
获取字符串长度:
string="abcd"
echo ${#string}
或
echo ${#string[0]}
提取子字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
查找子字符串
查找字符i或者o位置(哪个字母线出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io` # 输出4
- 整数变量
在一些Shell中,你可以使用
declare或者typeset命令声明整数变量。这样的变量只包含整数值,如果尝试将非整数值赋给它,Shell会尝试将其转换为整数。
declare -i my_integer=42
- 数组变量
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于C语言,数组元素的下标由0开始编号。
获取数组中的元素要利用下标,下标可以是整数或者算术表达式,其值应大于或等于0
定义数组:(数组元素用空格符号隔开)
定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
读取数组:
${数组名[下标]}
使用
@符号可以获取数组中的所有元素
array_name=(val0 val1 val2)
echo ${array_name[n]}
echo ${array_name[@]}
获取数组长度
length=${#array_name[@]}
lenget=${#array_name[*]}
- 环境变量
这些是由操作系统或者用户设置的特殊变量,用于配置Shell的行为和影响其执行环境。
PATH变量包含了操作系统搜索可执行文件的路径:
echo $PATH
- 特殊变量
有一些特殊变量在Shell中具有特殊含义,
例如:
#0表示脚本的名称
$1``$2等表示脚本的参数
$#表示传递给脚本的参数数量
$?表示上一个命令的退出状态等
Shell注释
以
#开头的行就是注释,会被解释器忽略。通过每一行加一个
#号设置多行注释多行注释
:<<EOF 注释内容 EOF # EOF也可以使用其他符号: :<<' 注释内容 ' :<<! 注释内容 ! : ' 注释内容 '
Shell传递参数
我们可以在执行Shell脚本时,向脚本传递参数,脚本内获取参数的格式为
$n,n表示一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数。其中$0为执行的文件名(包含文件路径)
$#:传递到脚本的参数个数
$*:以一个单字符串显示所有向脚本传递的参数
$$:脚本运行的当前进程ID号
$!:后台运行的最后一个进程的ID号
$@:与$*相同,但是使用时加引号,并在引号中返回每个参数
$-:显示Shell使用的当前选项,与set命令功能相同
$?:显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
Shell数组
数组中可以存放多个值。Bash Shell只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。
Shell数组用括号来表示,元素"空格"符号分割开,语法格式如下:
array_name=(value1 value2 ... valuen)
读取数组元素值的一般格式是:
${array_name[index]}
关联数组:
Bash支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素
关联数组使用
declare命令来声明,语法格式如下:declare -A array_name
-A选项就是用于声明一个关联数组关联数组的键是唯一的。
使用
@或*可以获取数组中的所以元素在数组前加一个感叹号
!可以获取数组的所有键在数组前加一个
#可以获取数组的长度
Shell基本运算符
Shell和其他编程语言一样,支持多种运算符,包括:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。
expr是一款表达式计算工具,使用它能完成表达式的求值操作。
#!/bin/bash
val=`expr 2 + 2`
# 注意表达式和运算符之间要有空格
关系运算符:
-eq :相等
-ne:不相等
-gt:大于
-lt:小于
-ge:大于等于
-le:小于相等
布尔运算符:
!:非运算法
-o:或运算
-a:与运算
逻辑运算符:
&&:逻辑的AND
||:逻辑的OR
字符串运算:
=:字符相等
!=:字符不相等
-z:长度为零
-n:长度不为0
$:字符串不为空
文件测试运算符:
-b:检测文件是否是块设备文件
-c:检测文件是否是字符设备文件
-d:检测文件是否是目录
-f:检测文件是否是普通文件
-g:检测文件是否设置SGID位
-k:检测文件是否设置了粘着位
-p:检测文件是否是有名管道
-u:检测文件是否设置SUID位
-r:检测文件是否可读
-w:检测文件是否可写
-x:检测文件是否可执行
-s:检测文件是否为空
-e:检测文件是否存在
使用$(())进行算术运算
$(())语法也是进行算术运算的一种方式
Shell echo命令
echo "It is a test"
此时双引号完全可以省略
echo It is a test
显示转义字符
echo "\"It is a test\""
显示换行
echo -e "OK \n"
显示不换行
echo -e "OK! \c"
显示结果定向至文件
echo "It is a test" > myfile
显示命令执行结果
echo `date`
Shell printf 命令
默认的printf不会像
echo自动添加换行符。printf命令的语法:
printf format-string [arguments]
%s:字符串%d:十进制整数%f:浮点数%c:字符%x:十六进制数%o:八进制数%b:二进制数%e:科学计数法表示浮点数
Shell流程控制
sh的流程控制不可为空
if else
if condition1
then
command1
elif conditons2
then
command2
else
commandN
fi
for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
或
for var in item1 item2 ... itemN; do command1; command2... done;
while语句
while condition
do
command
done
case ... esac
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
Shell函数
[ function ] funname [()]
{
action;
[return int;]
}
函数返回值在调用该函数后通过
$?来获得
Shell 输入/输出重定向
command > file:将输出重定向到file
command < file:将输入重定向到file
command >> file:将输出以追加的方式重定向到file
n > file:将文件描述符为n的文件重定向到file
n >> file:将文件描述符n的文件以追加的方式重定向到file
n >& m:将输出文件m和n合并
n <& m:将输入文件m和n合并
<< tag:将开始标记tag和结束标记tag之间的内容作为输入
Shell文件包含
Shell可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件
. filename
或
source filename

浙公网安备 33010602011771号