Shell 简介
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,shell 和 shell script 是两个不同的概念。
vi firstshell.sh
chmod u+x firstshell.sh 加入执行权限
#!/bin/bash
#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
echo "Hello,shell!"
运行脚本,三种调用方式:
[root@zzj test]# ./firstshell.sh 在当前目录下
[root@zzj ~]# ./../usr/test/firstshell.sh 相对路径
[root@zzj ~]# /usr/test/firstshell.sh 绝对路径
变量
运行shell时,会同时存在三种变量:
1、局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2、环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3、shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
注意,变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
Shell 字符串
单引号字符串:
#!/bin/bash
#单引号字符串
str='this is a string'
hello='Hello,'$str'!'
echo $hello
双引号字符串:
#!/bin/bash
name='Tokgo'
hello="Hello.I am "$name"!"
echo $hello
获取字符串长度
#!/bin/bash
#获取字符串长度
string="abcdefg"
echo ${#string} #输出7
expr length "$string"; #第二种方式 输出同样是7
提取子字符串
echo ${string:1:5} # 输出 bcdef
Shell 传递参数
$$ 当前shell进程编号
$0 当前脚本的文件名
$n 脚本参数 如: ./one.sh henry 18,则脚本中的$1为henry,$2为18
$# 脚本参数的数量 如上例: 2
$* 脚本参数的完整集合 如上例: henry ,18
$@ 脚本参数的独立集合 如上例: henry ,18
# $* vs $@
#不加"两者相同
#加上”则$*代表整体,而$@代表个体
假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),
而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
$? 上一条命令的执行结果状态值或函数的返回值: 0表示正常,1表示失败
$! 后台运行的最后一个进程的ID号
Shell 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
定义数组
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
array_name=(value0 value1 value2 value3)
#!/bin/bash
array=(1 2 3 4 5);
# 获取数组长度
length=${#array[@]}
# 或者
length2=${#array[*]}
#输出数组长度
echo $length #输出:5
echo $length2 #输出:5
# 输出数组第三个元素
echo ${array[2]} #输出:3
unset array[1]# 删除下标为1的元素也就是删除第二个元素
for i in ${array[@]};do echo $i ;done # 遍历数组,输出: 1 3 4 5
Shell 基本运算符
Shell 和其他编程语言一样,支持多种运算符,包括:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
算数运算符
下面是我四则运算的简单事例:
a=5
b=10
export hello=Hello,Linux
e=`expr $a + $b`
echo "a+b=$e"
e=`expr $b - $a`
echo "b-a=$e"
e=`expr $a \* $b`
echo "a*b=$e"
e=`expr $b / $a`
echo "b/a=$e"
echo "a+b=${e} b-a=${f} a*b=${m} b/a=${n}"
((g=$a + $b * $e))
echo $g
[root@zzj test]# source shell.sh
[root@zzj test]# echo $hello
Hello,Linux
关系运算符
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi
输出结果:
10 -le 20: a 小于或等于 b
布尔运算符
#!/bin/bash
a=10
b=20
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
输出结果:
10 小于 100 或 20 大于 100 : 返回 true
字符串运算符
#二元: == !=
=~
[[$var =~ PATTERN]]
不加"
#正则匹配
^ 开始
$ 结束
. —个任意字符
[] 指定范围 [abc] [a-z] [^a-b1-9]
< 单词开始
> 单词结束
\b 单词开始或结束
\B 非单词开始或结束
? {0,1}
+ {1,}
* {0,}
{n ,m} 最少n,最多m
{n,} 最少n次
{,m} 最多m次
{f} 固定f次
\ 转义符
() 组合
| 或
#一元: -z(是否为空) $str(是否不为空)
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
特殊表达式
`` <=> $() | 命令替换符,兼容性``更好 OUTOUT=start-all.sh |
---|---|
(()) | 算术运算加强版 |
$(()) <=> $[] | 算术运算, ( ( ) ) 中 变 量 可 以 加 (())中变量可以加 (())中变量可以加也可以不加 |
-[]- | -test命令- |
[[]] | 字符串计算加强版 |
${STR#*WORD} | 若STR符合WORD,将最短(WORD和左侧)的删除 <=> ${STR%WORD}(WORD和右侧) |
-${STR##*WORD}- | -若STR符合WORD,将最长(WORD和左侧)的删除 <=> ${STR%%WORD}(WORD和右侧)- |
${STR/WORD/REPLACE} | 若STR符合WORD,将第一个匹配项替换为REPLACE |
${STR//WORD/REPLACE} | 若SIR符合WORD,将所有匹配项替换为REPLACE |
-${STR:-DF_VALUE}- | -若STR未赋值或为空值,则设定STR值为DE_VALUE- |
${ARRAY[IX]} | 获取数组ARRAY下标IX的元素 |
${#ARRAY[@]} | 获取数组ARRAY的长度(ITEMl ITEM2 … ITEMN) |
-${ARRAY[*]}- | -整个数组- |
Shell 流程控制
分支结果
if [ EXPRESSION1 ]
then
…
elif [ EXPRESSION2 ]
then
…
else
…
fi
TYPE="$1"
if [ $TYPE == "start" ]
then
echo "start ..."
elif [ $TYPE == "stop" ]
then
echo "stop ..."
elif [ $TYPE == "restart" ]
then
echo "restart ..."
else
echo "not support : $1"
fi
case word in
WORD1) …
;;
WORD2) …
;;
*) …
;;
esac
case $1 in
1|3|5)
echo "红烧肉 ¥18.00"
;;
2|4)
echo "驴肉火烧 ¥28.00"
;;
6|7)
echo "豆芽 ¥2.00"
;;
*)
echo"非法星期 $1"
;;
esac
循环结构
while [ EPRESSION ]
do
…
done
V="henry ariel pola"
V=($V)
IX=0
while [ $IX -lt ${#V[*]} ]
do
echo ${V[$IX]}
((IX++))
done