shell脚本的基本元素
1.声明:声明用哪个命令解释器来解释并执行当前脚本文件中的语句,一般写的解释器为
#!/bin/bash 。
2.命令:可执行语句,实现程序的功能。
3.注释:说明某些代码的功能,通过在代码中增加注释可以提高程序的可读性。
shell脚本的执行方式
交互式执行
[root@localhost ~]# for filename in `ls /etc`
> do
> if echo "$filename" | grep "passwd"
> then
> echo "$filename"
> fi
> done
作为程序文件执行(常用)
对于一组需要经常重复执行的Shell语句来说,将它们保存在一个文件中来执行。我们通常称这种包含多个Shell语句的文件为Shell脚本,或者Shell脚本文件。脚本文件是普通的文本文件,可使用任何的文本编辑器查看或修改Shell脚本
[root@localhost ~]# mkdir /test
[root@localhost ~]# cd /test
[root@localhost test]# vim test1.sh
#!/bin/bash
for filename in `ls /etc`
do
if echo "$filename" | grep "passwd"
then
echo "$filename"
fi
done
常用系统命令
echo命令:在标准输出上输出信息
exec命令:能够在不创建子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程就终止
export:设置提示或显示环境变量
read:可以从标准输入读取字符串信息,传给shell程序内部定义的变量。
exit,退出sheel程序,在exit之后可以有选择的指定一个数作为返回状态
变量
变量的命名
变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。对于变量
名的长度,Shell并没有做出明确的规定。
基本语法
(1) 定义变量: 变量名=变量值, 注意, =号前后不能有空格
(2) 撤销变量: unset 变量名
(3) 声明静态变量: readonly 变量, 注意: 不能 unset
变量定义规则
(1) 变量名称可以由字母、 数字和下划线组成, 但是不能以数字开头, 环境变量名建
议大写。
(2) 等号两侧不能有空格
(3) 在 bash 中, 变量默认类型都是字符串类型, 无法直接进行数值运算。
(4) 变量的值如果有空格, 需要使用双引号或单引号括起来。
常用系统变量
$HOME、 $PWD、 $SHELL、 $USER 等
特殊变量
$n (功能描述: n 为数字, $0 代表该脚本名称, $1-$9 代表第一到第九个参数, 十以
上的参数, 十以上的参数需要用大括号包含, 如${10})
$# (功能描述: 获取所有输入参数个数, 常用于循环,判断参数的个数是否正确以及
加强脚本的健壮性) 。
$* (功能描述: 这个变量代表命令行中所有的参数, $*把所有的参数看成一个整体)
$@ (功能描述: 这个变量也代表命令行中所有的参数, 不过$@把每个参数区分对待)
$? (功能描述: 最后一次执行的命令的返回状态。 如果这个变量的值为 0, 证明上一
个命令正确执行; 如果这个变量的值为非 0(具体是哪个数, 由命令自己来决定) , 则证明
上一个命令执行不正确了。 )
变量的运算
运算符 | 说明 |
+、- | 求和、差 |
*、/、% | 求乘积,商,余数 |
** | 幂运算,例如3**3是求3的立方,即27 |
+=、-=、 *=、/=、%= | 例a+=1相当于a=a+1 |
++variable、- -variable | 先将变量variable的值加1,然后再赋给variable; 先将变量variable的值减1, 然后再赋给variable |
variable++、 variable-- | 先使用variable的值,然后再将该变量的值加1; 先使用variable的值,然后再 将该变量的值减1 |
位运算符<<、 >> | 位运算通常出现在整数间,它针对的不是整个整数,而是其二进制表示形式中的 某个或者某些位(bit)。例如,2>>1是将二进制形式的2,即10,左移1位,从 而变成100,即4。 左移,4<<2,将4左移2位,结果为16; 右移,8>>2,将8 右移两位,结果为2 |
&、|、~、^ | 按位与,8&4,将8和4进行按位与运算,结果为0; 按位或,8|4,将8和4进行 按位或运算,结果为12; 按位非,~8,将8进行按位非运算,结果为-9(一个字 符占一个字节,即8个二进制位,最高位为1时为负数); 按位异或(a异或b, a、b值不同结果为1,相同结果为0),10^6,将10和6进行按二进制位异或运 算,结果为12。 |
<<=、>>= | 将变量的值左移指定位数之后重新赋给该变量,x<<=3,将x的值左移3位,重新 赋给变量x; 将变量的值右移指定位数之后重新赋给该变量,x>>=4,将变量x的 值右移4位后重新赋给变量x。 |
&=、|=、^= | 将变量的值与指定的数值按位与之后重新赋给该变量,x&=8,将变量x的值与8 按位与运算之后重新赋给变量x; 将变量的值与指定的数值按位或之后重新赋给 该变量,x|=7,将变量x的值与7执行按位或运算之后重新赋给变量x; 将变量的 值与指定的数值按位异或之后重新赋给该变量,x^=9,将变量x的值与9执行按 位异或运算之后重新赋给变量x。 |
运算操 作符与 运算命 令 | 意义 | 说明 |
(()) | 用于整数运 算的常用运 算符 | 在(())中使用变量时可以去掉变量前的$符号 |
let | 用于整数运 算 | 使用let命令可以执行一个或者多个算术表达式,其中的变量名毋需使 用$符号 |
expr | 可用于整数 运算,但还 有很多其他 的额外功能 | 使用expr时,运算符及用于计算的数字左右都至少有一个空格,否则 会报错;使用乘号时,必须使用反斜线屏蔽其特定含义;使用expr做 计算,将一个未知的变量和一个已知的整数相加,看返回码是否为 0,如果为0就认为做加法的变量为整数,否则就不是整数。 |
bc | linux下的一 个计算器程 序(适合整 数及小数运 算) | [root@localhost test4]# echo seq -s "+" 10 = seq -s "+" 10 | bc seq是生成数字序列,-s是指定数字序列之间的分隔符 |
$[] | 用于整数运 算 | |
awk | awk既可以 用于整数运 算,也可以 用于小数运 算 | |
declare | 定义变量值 和属性,-i 参数可以用 于定义整形 变量,做运 |
表达式 | 说明 |
${parameter} | 返回变量的内容 |
${#parameter} | 返回变量内容的长度(按字符) |
${paramater:offset} | 在变量${parameter}中,从位置offset之后开始提取子串到结 尾 |
${paramater:offset:length} | 在变量${parameter}中,从位置offset之后开始提取长度为 length的子串 |
${parameter#word} | 从变量${parameter}开头开始删除最短匹配的word子串 |
${parameter##word} | 从变量${parameter}开头开始删除最长匹配的word子串 |
${parameter%word} | 从变量${parameter}结尾开始删除最短匹配的word子串 |
${parameter%%word} | 从变量${parameter}结尾开始删除最长匹配的word子串 |
${parameter/pattern/string} | 使用string代替第一个匹配的pattern |
${parameter//pattern/string} | 使用string代替所有匹配的pattern |