Shell脚本概述:Shell脚本是利用shell的功能所写的一个程序。这个程序是使用纯文本文件,将一些Shell的语法与命令(含外部命令)卸载里面,搭配正则表达式、管道命令与数据重流重定向等功能。
编写流程:需求分析、命令测试、脚本编写、测试调优。
linux@linux:~/test$ vi test.sh
linux@linux:~/test$ bash test.sh
Hello,World
linux@linux:~/test$ source test.sh
Hello,World
linux@linux:~/test$ ./test.sh
bash: ./test.sh: Permission denied
sudo: ./test.sh: command not found
linux@linux:~/test$ chmod 0777 test.sh
linux@linux:~/test$ ./test.sh
Hello,World
linux@linux:~/test$ cat test.sh
#!/bin/bash
echo "Hello,World"
变量介绍:变量来源于数学,是计算机语言中能存储计算结果或能表示值得抽象概念。
变量可以通过变量名访问。在指令式语言中变量通常是可变的。
变量作用:用来存放系统和用户需要的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
命名规则:区分大小写、不能使用程序内的保留字和内置变量 、只能使用数字、字母及下划线,且不能以数字开头、使用英文尽量词义通俗易懂。
变量分类:自定义变量:由用户自己定义修改使用。特殊变量(环境变量(由系统维护,用于设置工作环境)、制度变量(用于变量值不允许被修改的情况)、位置变量(通过命令行给脚本程序传递参数)、预定义变量(bash中内置的一类变量,不能直接改变))
用户自定义变量:
- 双引号:允许通过$符号引用其他变量的值,弱引用,其中变量引用会被替换为变量值
- 单引号:禁止引用其他变量值,$视为普通字符,强引用,其中变量引用不会替换为变量值,而保持源字符串
- 反撇号:命令替换,提取命令执行后的输出结果,``and$(....)作用相同
- echo $a:默认显示数组第一个字符
- echo ${a[*]} and echo ${a[@]} 显示全部字符
-
echo ${a[#*]} and echo ${a[#@]} 取出元素个数
-
echo ${a[i]} 取第i个元素 数组赋值a[i]=9
-
unset a[i] 删除第i个 unset a 删除整个数组
-
在底行模式下 noh 取消高亮
-
echo ${a[@]:1:3} 从1 开始打印,打印三个数据元素
-
只读变量:变量值不允许修改(重新赋值)的情况、无法用unset删除、最快方法重启、readonly
-
位置变量和预定义变量:
$0
:表示脚本或命令本身的名称。$1
、$2
、$3
等:表示命令行传递的参数。例如,$1
表示第一个参数,$2
表示第二个参数,以此类推。-
$*
或$@
:表示传递的所有参数。$* 是一个整体 $#
:表示传递的参数个数。- 我们使用
$?
变量来获取上一个命令的退出状态码 -
常用环境变量:
$HOME
:当前用户的主目录路径。$USER
:当前登录用户的用户名。$PWD
:当前工作目录的路径。$PATH
:系统搜索可执行文件的路径列表。$LANG
:当前系统的语言设置。$HOSTNAME
:当前主机的主机名。$SHELL
:当前用户的默认shell。-
Shell语句
-
Shell程序由零或多条shell语句构成。shell语句包括三类:说明性语句、功能性语句、结构性语句。
-
说明性语句:以#号开始到该行结束,解释不被执行
-
功能性语句:
-
read从标注输入读入一行,并赋值给后面的变量,如: read -p "input a number" val read val1 val2 val3
-p
:指定一个提示字符串,作为用户输入前的提示信息。-t
:设置一个超时时间(秒),如果用户在指定时间内没有输入,则退出。如果不指定超时时间,read
命令将一直等待用户的输入。-s
:使用静默模式,用户输入的内容不会显示在终端上,适用于输入密码等敏感信息。- 整数运算: expr 包括加(+)减(-)乘(\*)除(/)求模(%) expr &n \* 6
- 测试语句: test可测试三种对象(字符串、整数、文件属性)每种测试对象有若干测试操作符
- 字符串测试:
[ -z "$name" ]
-z string
:检查字符串是否为空,如果是空则返回真。-n string
:检查字符串是否非空,如果非空则返回真。string1 = string2
:检查两个字符串是否相等,如果相等则返回真。string1 != string2
:检查两个字符串是否不相等,如果不相等则返回真。-e file
:检查文件是否存在,如果文件存在则返回真。-f file
:检查文件是否为普通文件,如果是则返回真。-d file
:检查文件是否为目录,如果是目录则返回真。-r file
:检查文件是否可读,如果可读则返回真。-w file
:检查文件是否可写,如果可写则返回真。-x file
:检查文件是否可执行,如果可执行则返回真。n1 -eq n2
:检查n1是否等于n2,如果相等则返回真。n1 -ne n2
:检查n1是否不等于n2,如果不相等则返回真。n1 -gt n2
:检查n1是否大于n2,如果是则返回真。n1 -ge n2
:检查n1是否大于等于n2,如果是则返回真。n1 -lt n2
:检查n1是否小于n2,如果是则返回真。n1 -le n2
:检查n1是否小于等于n2,如果是则返回真。- 方式1: test $name -eq $1 cheo $?
- 方式2: if [ -f $filename ] then ..... fi
- 方式3:if test -f $filename then ..... fi
- 返回值0为真,返回值非0为假
分支语句:
-
#!/bin/bash A=`grep "^linux:" /etc/passwd | wc -l` if [ $A -eq 1 ] then echo "exist" else echo "not exist" fi
多路分支语句: case...esac
-
case 字符串变量 in 模式1) 命令表1 ;; esac
#!/bin/bash #study contral #80-100 A #60-79 B #0-59 C read -p "Please input your score:" val if [ $val -gt 100 -o $val -lt 0 ] then echo "input error val" exit fi A=`expr $val / 10` case $val in 8 | 9 | 10) echo "A" ;; 6 | 7 ) echo "B" ;; *) echo "C" ;;
循环语句:
-
for用法 for 变量名 in 单词表 do 命令表 done
-
for 变量依次取单词表中的各个单词,每取依次单词,就执行依次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条,也可以是由分好或换行符分开的多条。如果单词表是命令行上的所有位置参数时,可以在for语句中省略“in 单词表”
-
while用法 while 命令表达式 do 命令表 done
-
while语句首先测试其后的命令或表达式的值,如果为真,就执行依次循环体中的命令,然后再测试改命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
-
while语句的退出状态为命令表中被执行的最后一条命令的退出状态
-
循环控制语句: break n跳出n层循环 continue 语句则马上转到最近一层循环语句的下一轮循环上,continue n 则转到最近n层循环语句的下一轮循环上。
-
函数定义: function name(){
statements
[return value]
}
- function 是关键字专门定义函数 name是函数名 statements是函数要执行的代码 return value是返回值,这一部分可以不写