shell 的直译是贝壳:是内核的一种保护机制;用户和内核交互的桥梁;shell是命令行解释器(工具)
用户在命令行提示符下键入命令文本,开始与Shell进行交互。接着,Shell将用户的命令或按键转化成内
核所能够理解的指令控制操作系统做出响应,直到控制相关硬件设备。然后, Shell将输出结果通过Shell提
交给用户。
解释型语言
shell命令的有序集合
shell是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁
shell的基本步骤
基本过程分为三步:
1.建立shell文件
包含任意多行操作系统命令或shell命令的文本文件;
2.赋予shell文件执行权限
用chmod命令修改权限;
3.执行shell文件
直接在命令行上调用shell程序.
1、shell变量
Shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解
释为一串字符
3、变量类型
Bourne Shell有如下四种变量:
用户自定义变量
位置变量 即命令行参数
预定义变量
环境变量
自定义变量
#在shell编程中通常使用全大写变量,方便识别
$ COUNT=1
#变量的调用:在变量前加$
$ echo $HOME
#Linux Shell/bash从右向左賦值
$ Y=y
$ X=$Y
$ echo $X
y
#使用unset命令删除变量的赋值
$ Z=hello
$ echo $Z
hello
$ unset Z
$ echo $Z
$0 与键入的命令行一样,包含脚本文件名
$1、$2,……$9 分别包含第一个到第九个命令行参数
$# 包含命令行参数的个数
$@包含所有命令行参数: "$1,$2,......$9"
$?包含前一个命令的退出状态
$ *包含所有命令行参数: "$1,$2,......$9"
$$包含正在执行进程的ID号
HOME: /etc/passwd 文件中列出的用户主目录
IFS: Internal Field Separator,默认为空格,tab及换行符
PATH: shell搜索路径
PS1, PS2:默认提示符($)及换行提示符(>)
TERM:终端类型,常用的有vt100,ansi,vt200,xterm等
说明性语句:以#号开始到该行结束,不被解释执行
功能性语句:任意的shell命令、用户程序或其它shell程序。
结构性语句:条件测试语句、多路分支语句、循环语句、循环控制语句等。
注释行可以出现在程序中的任何位置,既可以单独占用一行,也可以接在执行语句的后面,以#号开始到所在行的行尾部分,都不被解释执行,例如:
read为从标准输入读入一行,并赋值给后面的变量,其语法为
read var
#把读入的数据全部赋给var
read var1 var2 var3
#把读入行的第一个单词赋值给var1 ,第二个单词赋值给var2 ……把其余所有的词赋值给最后一个变
###如果执行read语句时标准输入无数据,则程序在此停留等侯,直到数据的到来或被终止运行。
read 选项
-p:用于显示提示消息,以引导用户输入。例如:read -p "请输入用户名:" username。
-s:用于将用户输入的字符隐藏,通常用于密码输入。例如:read -s -p "请输入密码:" password。
-n:用于限制输入的字符数。例如:read -n 4 -p "请输入验证码:" code,这将读取用户输入的前四个字符。
-t:用于设置读取超时时间,单位为秒。例如:read -t 5 -p "请在 5 秒内输入:" input,如果用户在 5 秒内没有输入,将退出读取。
-a:用于将用户输入的内容存储到一个数组中。例如:read -a names,这将读取一行输入,并将每个单词存储到名为 names 的数组中。
算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如:
$ expr 12 + 5\*3
#27
$ exp 3 - 8 / 2
#-1
$ num=9
$ sum=`expr $num \* 6`
$ echo $sum
#54
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
a -eq 测试a与b是否相等
a -ne b测试a 与b 是否不相等
a -gt b 测试a 是否大于b
a -ge b 测试a 是否大于等于b
a -lt b 测试a 是否小于b
a -le b测试a旦不小于等于h
-d name #测试name 是否为一个目录
-e name #测试一个文件是否存在
-f name #测试name 是否为普通文件
-l name #测试name 是否为符号链接
-r name #测试name 文件是否存在且为可读
-w name #测试name 文件是否存在且为可写
-x name #测试name文件是否存在且为可执行
-s name #测试name文件是否存在且其长度不为0
f1 -nt f2 #测试文件f1是否比文件2更新
f1 -ot f2 #测试文件f1是否比文件f2更旧
#方式一
test $name -eq $1
echo $?
#方式二
if test -f $filename
then
fi
#方式三
if [ -f $filename ]
then
...
fi
echo 是一个常用的命令,用于在终端上打印输出文本。它也有一些参数可以用来定制输出的行为。以下是几个常见的 echo 参数:
-n:不换行输出。默认情况下,echo 在输出完文本后会自动换行,使用 -n 参数可以禁止其换行。
例如:
echo -n "Hello, World!"。
-e:启用转义字符解释。某些情况下,你可能需要使用一些特殊的字符,如换行符 \n,制表符 \t 等。
使用 -e 参数会解析转义字符。例如:
echo -e "Line 1\nLine 2"。
-E:禁用转义字符解释。与 -e 相反,使用 -E 参数会禁止解析转义字符。例如:
echo -E "Line 1\nLine 2"。
-s:禁止显示输入。通常用于密码输入,可以让用户输入时显示为空。例如:
echo -s "Please enter your password: " password。
-c:禁止显示命令。使用 -c 参数可以防止Shell在执行时将命令显示出来。例如:
echo -c "This is a secret command!"
# if...then...else...fi
# 语法结构
if 表达式
then 命令表1
else 命令表2
fi
###如果表达式为真,则执行命令表1中的命令,再退出if语句;否则执行命令表2中的语句,再退出if语句.
无论表达式是否为真,都有语句要执行
结构性语句主要根据程序的运行状态、输入数据、变量取值、控制信号、运行时间等因素来控制程
序的流程。主要包括:条件测试语句(二路分支)、多路分支语句、循环语句、控制循环语句和后
台执行语句。
1)条件测试语句
1.if……then……fi语句
类似C语言的if语句,格式为:
if 表达式
then 命令
fi
如果表达式为真,则执行命令表中的命令,否则退出if语句。fi表示if语句的结束,类似C语言的
右括号}。fi和if必须成对出现。
2.if……then……else……fi语句
类似C语言的if-else语句,格式为:
if 表达式
then 命令1
else
命令2
fi
如果表达式为真,则执行命令表中的命令,否则执行else下命令。
3.if……then……elif……fi语句
类似C语言的if-else语句多重并列使用,格式为:elif
if 表达式1
then 命令1
elif 表达式2
then 命令2
……
else
命令n
fi
# case...esac
# 多路分支语句case用于多重条件测试,语法结构清晰自然。语法为:
case 字符串变量 in #case语句只能检测字符串变量
模式1) #各模式中可用文件名元字符,以右括号结束
命令表1
;;
模式2|模式3) #一次可以匹配多个模式用|隔开
命令表2
;; #命令表以单独的双分号结束,退出case语句
模式n)
命令表n #模式n通常写为字符* 表示其他所有模式
;; #最后一个双分号可以省略
esac
# for...do...done
#当循环次数已知或确定时,使用for循环语句来多次执行一条或一组,命令。 循环体由语句括号do和done
来限定。格式为:
for 变量名 in 单词表 # 单词表海还可以为{1..5}或seq 1 5 都表示1到5
do
命令表
done
变量依次取单词表中的各个单词,每取一次单词,就执行一次循环体中的命令,
循环次数由单词表中的单词数确定,命令表中的命令可以是一条,也可以是由分号
或换行符分开的多条。如果单词表是命令行上的所有位置参数时,可以在for语句
中省略“in单词表”部分。