Shell程序设计
主要功能:命令解释程序/作为一种高级程序实际语言。
主文件夹——其他位置——计算机——etc——passwd
cat /etc/shells
head /etc/shells
more /etc/shells
例如tcsh --version查看显示的Shell版本
vi编辑器或cat
vi 脚本名
录入
ls -l
cal
who
查看
cat 脚本名
shell脚本的执行
输入定向的执行方式
sh <脚本名
以脚本名作为shell参数的执行方式
sh 脚本名 【参数】或 sh 脚本名
修改执行权限后直接执行方式
(1)利用chmod命令
u代表该档案的拥有者
g代表与该档案拥有着同属于同一个群体者
o 代表其他以外的人
a 代表这三者皆是
+代表增加权限
-代表取消权限
=代表唯一设定权限
r代表可读取
w代表可写入
x代表可执行
./脚本名(前面有一个点)
(2)cp 脚本名/bin
脚本名
变量名:字母,数字,下划线
Shell环境变量和shell用户自定义变量
一般都是大写的
PWD 当前工作目录的名称
HOME 用户初次登录时起的起始目录名
……
利用echo显示执行
echo 显示变量的命令
特殊的环境变量
$0 shell程序名
$1-$9 第一个至第九个命令行参数的值
$* 所有命令行参数的值
$# 命令行参数的总数
$$ 当前进程的进程ID
……
位置参数
R输出位置参数
利用echo命令输出位置参数
(CTRL+D保存并结束)
R用set命令给未知参数赋值
R移动位置参数
Shift 参数
位置参数左移参数位
由字母和下划线开头的字母、数字、下划线序列,并且大小写字母意义不同(尽量是大写)
格式:变量名=值或字符串
使用变量:$
说明
u字符串赋值:
v如果在赋给变量的值中要含有空格、制表符或换行符,那么就要用双引号把这个字符串括起来
w在一个赋值语句中可以出现多个赋值,变量赋值可以迭代进行,但必须注意,各赋值动作是从左往右进行的
x变量值可以作为某个长字符串中的一部分。如果它在长字符串的末尾,就可以利用直接引用模式
例如:
Sl=ing
Echo walk$SI
变量名出现在一个长字符串开头或中间,应该用“{}”八变量名括起来。
dir=/home/user1/
echo ${dir}m1.c
查看所有shell命令
env
用不带参数的set命令可以显示所有“shell变量(包括用户自定义变量)。
(1)星号(*) :匹配任意的字符串
(2)问号(?) :匹配任意一个字符
(3)一对方括号([]):方括号中有一个字符组,作用是匹配该字符组所限定的任何一个字符
例如:f[abcd]可以匹配fa、fb、fc、fd,与f[a-d]作用相同
(4)感叹号(!) :表示不在一对方括号中列出的字符
例如:f[!a-d]表示以f开头除了fa、fb、fc、fd的文件名
ls t*
(1)双引号(””)由双引号引起来的字符,除了$、倒引号和反斜线(/)仍保留其功能以外,其余字符作为普通字符对待
(2)单引号(’’)有单引号引起来的字符或字符串都作为普通字符出现
ushell解释执行
v利用倒引号的shell解释功能可以进行命令替换
w倒引号的嵌套应用,倒引号钱嵌套时必须使内层一组倒引号用反斜线(/)转义
u顺序分隔符(;)多条命令
v管道线(|)顺序执行,把前面命令的输出当做后面命令的输入
(2)逻辑与(&&)
只有前一个命令执行成功以后,后一个命令才能够执行
前一个命令执行不成功,后一个命令才能够执行
转义符
string=”abcd”
echo ${#string} #输出4
变量为数组时,
string=”abcd”
echo ${#string[0]} #输出4
实例:从字符串第2个字符开始截取4个字符
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
注意:第一个字符的索引值为0
三种
标准输入文件
标准输出文件
标准错误输出文件
< 输入 > 输出 >> 重定向 2> 错误输出
command < input-file
(输入的文件一定是已经存在的文件)
将输入的命令执行以后显示在屏幕上,但并不改变原文档中的内容。
command > output -file
将命令执行以后的输出内容重定向到指定文件中(覆盖)
command >> output-file
将命令执行以后附加到指定文件的结尾处
command 2> error – file
command1 < infile > outfile
同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。
它的基本的形式如下:
command << delimiter
document
delimiter
作用:是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
注意:
结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
开始的delimiter前后的空格会被忽略掉。
read 变量1 【变量2】 ……(各参数之间用空格隔开)
变量个数等于给定数据个数
变量个数少于给定数据个数
取值为剩余的全部
变量个数多于给定数据个数
取值为空串
各参数之间用空格隔开
特殊符号
\b 退格
\c 不将光标移到下行
\f 换页
\n 换行
\r 回车
\t 水平制表符
\ 垂直制表符
\\ 反斜线
\ON ASCII码为八进制N的字符
特殊符号的转义符功能echo命令输出,必须加上“-e”参数
“-n”参数代表命令输出以后不换行
if 判断条件
then 命令1
else 命令2
fi
命令语句形式的判断条件
测试语句形式的判断条件(三种)
字符串测试 文件测试 数值测试(详见下面的测试语句)
if 判断条件1
then 命令1
elif 判断条件2
then 命令2
…
else 命令n
fi
格式1
test expression
格式2
[ expression ]
-r file 若文件存在并且是用户可读的,则测试条件为真
-w file 若文件存在并且是用户可写的,则测试条件为真
-x file 若文件存在并且是用户可执行的,则测试条件为真
-f file 若文件存在并且是普通文件,则测试条件为真
-d file 若文件存在并且是目录文件,则测试条件为真
-p file 若文件存在并且是FIFO文件,则测试条件为真
-s file 若文件存在并且不是空文件,则测试条件为真
str 如果字符串str不是空字符串,则测试条件为真
str1 = str2 如果str1等于str2,则测试条件为真
str1 != str2 如果str1不等于str2,则测试条件为真
-n str 如果字符串str的长度不为0,则测试条件为真
-z str 如果字符串str的长度为0,则测试条件为真
在引用变量及字符串中,要用双引号引上
n1 -eq n2 如果整数n1等于n2,则测试条件为真
n1 -ne n2 如果整数n1不等于n2,则测试条件为真
n1 -lt n2 如果整数n1小于n2,则测试条件为真
n1 -le n2 如果整数n1小于等于n2,则测试条件为真
n1 -gt n2 如果整数n1大于n2,则测试条件为真
n1 -ge n2 如果整数n1大于等于n2,则测试条件为真
! 非
-a 与
-o 或
() 将表达式分组,优先得到结果,括号前后应有空格并用转义字符
case string1 in
str1)
commands – list1;;
str2)
commands – list2;;
…
strn)
commands – listn;;
esac
for variable [in argument – list]
do
command – list
done
[in argument – list]为可选项,由三种表达形式
变量的值依次取当前目录(或指定目录)下与文件表达式相匹配的文件名,每取值一次,就进入循环体执行命令表,直到所有匹配的文件名取完为止。
[argument-list]也可以用$*来代替,变量依次取位置参数的值,然后执行循环体中的命令表,直至所有位置参数取完为止。
格式为:
while expression
do
command-list
done
ubreak命令
可以从循环体中退出来。格式为:
break [n]
vcontinue命令
跳过循环体中在它之后的语句,回到本层循环的开头,进行下一次循环。格式为:
continue [n]
u五种基本的算术运算:
+(加)、-(减)、\*(乘)、/(除)和%(取模)。
shell只提供整数的运算。
格式如下:
expr n1 运算符 n2
注意:在运算符的前后都留有空格,否则expr不对表达式进行计算,而直接输出它们。
exit [n]
其中n为设定的退出值,如果未给定n的值,则退出值为最后一个命令的执行状态。
在shell脚本中可以定义并使用函数。其定义格式为:
Function( )
{
command-list
}
函数应先定义,后使用。调用函数时,直接利用函数名调用。
退出函数命令
return [n]
until expression
do
command – list
done
只要expression的值为假,就执行command – list语句