Shell脚本其实就是所有的Shell命令组合而形成的为实现某一个功能的代码。
1.shell脚本的运行级别
0 系统终止模式
1 单用户模式
2 不使用NFS的多用户模式
3 完全多用户模式(文本模式):用于服务器
4 不使用
5 X11 GUI模式;用于桌面
6 重启模式
2.变量(Bourne shell)
2.1 shell中的变量一般以大写字母定义,分为全局变量和局部变量。
2.2 所有的shell中都可以使用全局变量或环境变量,使用env命令或者printenv命令显示环境变量。
2.3 局部变量也可以使用命令export变为环境变量,如下:
[qwe@localhost ~]$ MY_NAME="TAEYONG KIM"
[qwe@localhost ~]$ pstree -p | grep bash
|-gnome-terminal(2385)-+-bash(2387)-+-grep(6203)
[qwe@localhost ~]$ bash
[qwe@localhost ~]$ pstree -p |grep bash
|-gnome-terminal(2385)-+-bash(2387)---bash(6204)-+-grep(6220)
[qwe@localhost ~]$ echo "$MY_NAME"
[qwe@localhost ~]$ exit
exit
[qwe@localhost ~]$ pstree -p |grep bash
|-gnome-terminal(2385)-+-bash(2387)-+-grep(6224)
[qwe@localhost ~]$ export MY_NAME
[qwe@localhost ~]$ bash
[qwe@localhost ~]$ pstree -p | grep bash
|-gnome-terminal(2385)-+-bash(2387)---bash(6230)-+-grep(6245)
[qwe@localhost ~]$ bash
[qwe@localhost ~]$ exit
exit
[qwe@localhost ~]$ echo "MY_NAME"
MY_NAME
说明:局部变量要转换为环境变量,只能在父进程中使用export进行变量转换。
3.Bourne shell
3.1 显示器显示:使用echo命令在屏幕上显示字符,含有空格的字符串可使用引号(双引号/单引号)。
3.2 局部变量只能在当前shell中使用,脚本结束后就不能再使用。(脚本中的等号前后不能有空格)
[qwe@localhost aaa]$ cat var.sh
#!/bin/sh
name="TAEYONG KIM"
echo $name
[qwe@localhost aaa]$ chmod +x var.sh
[qwe@localhost aaa]$ ./var.sh
TAEYONG KIM
[qwe@localhost aaa]$ echo $name
3.3 在变量前加$就能从变量读取值。
[qwe@localhost aaa]$ sdf="SDFG"
[qwe@localhost aaa]$ echo $sdf
SDFG
3.4 数组:使用内置set命令生成词目录,每个词分配于每个位置顺序。
[qwe@localhost aaa]$ set word1 word2 word3
[qwe@localhost aaa]$ echo $1
word1
[qwe@localhost aaa]$ echo $*
word1 word2 word3
3.5 替换命令:可以在命令中使用反单引号(' '),将linux命令结果分隔为变量或者用作字符串。
[qwe@localhost aaa]$ vi common.sh
[qwe@localhost aaa]$ ./common.sh
Mon Apr 6 02:07:27 PDT 2020
jintianshiMon Apr 6 02:07:27 PDT 2020
[qwe@localhost aaa]$ cat common.sh
#!/bin/sh
now=`date`
echo $now
echo "jintianshi`date`"
3.6 算术运算和运算符
算术运算:不支持算术运算,所以使用linux的运算命令。
运算符:等值 =字符串 !=字符串 -eq数字 -ne数字
逻辑 -a:and -o:or !:not
关系 -gt:大于 -ge:大于等于 -lt:小于 -le:小于等于
3.7 if语句和循环语句
if语句:用于条件语句,if语句的末尾必须输入fi。
while循环:当输入为ture时,就执行do和done之前的内容。
[qwe@localhost aaa]$ ./while.sh
0
1
2
3
4
script complete....
[qwe@localhost aaa]$ cat while.sh
#!/bin/sh
num=0
while [ $num -lt 5 ]
do
echo "$num"
num=`expr $num + 1`
done
echo "script complete...."
for循环一般通过词目录反复,处理一个词后移动到下一个继续处理。
[qwe@localhost aaa]$ chmod +x for.sh
[qwe@localhost aaa]$ ./for.sh
apples
bananas
pears
oranges
script complete....
[qwe@localhost aaa]$ cat for.sh
#!/bin/sh
for fruit in apples bananas pears oranges
do
echo $fruit
done
echo "script complete...."
4.Bash shell语法和结构
4.1 别名
4.1.1 别名目录:使用alias内置命令显示设置为别名的所有命令。
4.1.2 创建别名:使用alias命令可以创建别名。第一个参数是别名名称,在“=”符号后输入字符串,该字符串执行指定为别名的名称,该名称就是要执行的命令。
4.1.3 删除别名:unalias命令用于删除别名。
4.2 元字符集:shell元字符集又称为通配符。
\ 解析后面的字符本身
& 在后台执行
; 分隔命令
$ 替换变量
? 匹配一个字符
[abc] 多种字符只匹配其中一个
[!abc] 不匹配任何字符
* 匹配0个以上字符
[qwe@localhost aaa]$ ls
common.sh for.sh name1 var.sh vimtext while.sh whiletext.sh
[qwe@localhost aaa]$ ls while*.sh
while.sh whiletext.sh
[qwe@localhost aaa]$ commo?.sh
bash: common.sh: command not found
[qwe@localhost aaa]$ ls commo?.sh
common.sh
[qwe@localhost aaa]$ ls [asv]ar.sh
var.sh
[qwe@localhost aaa]$ ls [!a-e]or.sh
for.sh
4.3 变量
变量分为全局变量和局部变量。
变量名必须以字母或“_”字符开始,起始字符后可输入字母、数字、“_”等。
局部变量一般通过变量名赋值,或者通过declare内置函数进行创建。全局变量一般用大写字母定义,可以使用export内置命令将局部 变量变为全局变量。
局部变量若不是只读状态,可以使用unset命令清除设置。即可以从shell内存中删除变量。
显示变量值:echo内置命令通过标准输出显示参数。printf命令可以指定格式输出,后面可以使用后多种指示符,%f表示实数型格式,%d表示十进制整数型格式。
引用符号:反斜杠(\)、单引号(' ')、双引号(" ")
替换命令:反单引号(``)、$()格式使用
[qwe@localhost aaa]$ d=$(date)
[qwe@localhost aaa]$ echo $d
Mon Apr 6 06:12:02 PDT 2020
4.4 算数运算:结果只保留整数。
$[算数表达式] $(算数表达式)
[qwe@localhost aaa]$ echo $[8+5]
13
[qwe@localhost aaa]$ echo $[(5+3)*2]
16
[qwe@localhost aaa]$ echo $((9+8)/2)
bash: command substitution: line 1: syntax error near unexpected token `/2'
bash: command substitution: line 1: `(9+8)/2'
[qwe@localhost aaa]$ echo $(9/2)
bash: 9/2: No such file or directory
[qwe@localhost aaa]$ echo $(((9+8)/2))
8
注意:除法必须要有括号括起来。
4.5 数组
Bash Shell支持创建一维数组,可以用内置函数declare -a以x[0]格式创建。
[qwe@localhost aaa]$ names=(marry TIM Jarry tom)
[qwe@localhost aaa]$ echo names[0]
names[0]
[qwe@localhost aaa]$ echo ${names[0]}
marry
[qwe@localhost aaa]$ echo ${names[3]}
tom
注意:输出数组每个元素的格式如以上代码。
4.6 函数
bash函数的定义一般有两种,一种是函数名和空括号(()),然后定义函数;另一种方法是使用function和函数名。
[qwe@localhost ~]$ function hello { echo "it is a good day,say hello";}
[qwe@localhost ~]$ hello
it is a good day,say hello
[qwe@localhost ~]$ function hello1{
> echo "it is a bad idea"
bash: syntax error near unexpected token `echo'
[qwe@localhost ~]$ function hello1{ echo "it is a bad idea";
bash: syntax error near unexpected token `echo'
[qwe@localhost ~]$ function hello1 { echo "it is a bad idea";
> }
[qwe@localhost ~]$ hello1
it is a bad idea
使用declare -f 可以显示已经定义的所有函数。
使用"unset -f函数名"可以清除当前shell定义的函数。