Shell概述
shell是用户和系统内核之间的接口程序
shell是命令解释器
shell指linux的终端,即解释用户命令和shell程序的文字终端
查看用户使用shell的设定:
通过查看/etc/passwd文件可以查看用户使用的shell类型:cat /etc/passwd
查看安装的shell:cat /etc/shells
Shell程序的特点及用途
shell程序可以认为是将shell命令按照控制结构组织到一个文本文件中,批量的交给shell去执行
不同的shell解释器使用不同的shell命令语法
shell程序解释执行,不生成可以执行的二进制文件
可以帮助用户完成特定的任务,提高使用、维护系统的效率
了解shell程序可以更好的配置和使用linux
Shell使用解释型语言,不需重新编译
它适合于编写执行相对简单的任务的工具,因为它更强调易于配置、维护和可移植性
它不适合用来完成时间紧迫型和处理器忙碌型的任务
shell程序结构
执行程序:
可以使用 /bin/bash filename
添加执行权限,指定路径执行:chmod +x /path/filename
运行:./path/filename
shell程序一般结构:
shell类型
函数
主过程
变量声明及赋值格式:变量=值 (注意:等号两侧不能有空格)
变量的引用:$变量名 或者 ${变量名}
如果字符串里包含空格,就必须用引号把它们括起来。默认情况下,所有输入的内容都是字符串。
示例:
程序编译和运行过程
位置变量
bash在解释用户命令时,会把所输入的命令后面的参数使用位置变量传递给bash脚本程序
$1、$2… $n分别代表参数1、参数2…参数n
$0 则代表脚本的名字
$*:这个变量包括参数的列表(字符串)。
$@:这个变量包括参数的列表(数组)。
$#:这个变量包括参数的个数。
环境变量
提示符特殊字符代码
\ ! 显示该命令的历史记录编号。
\ # 显示当前命令的命令编号。
\ $ 显示$符作为提示符,如果用户是root的话,则显示#号。
\ \ 显示反斜杠。
\d 显示当前日期。
\h 显示主机名。
\s 显示当前运行的shell的名字。
\t 显示当前时间。
\u 显示当前用户的用户名。
\W 显示当前工作目录的名字。
\w 显示当前工作目录的路径。
在shell的环境变量中更改.bashrc
/etc/profile
/etc/environment
source .bashrc 马上生效
简单数学表达式
① expr命令计算一个表达式的值
格式 :expr arg
例子:计算(2+3)×4的值
1、分步计算,即先计算2+3,再对其和乘4
s=`expr 2 + 3`
expr $s \* 4
2、一步完成计算:
expr `expr 2 + 3 ` \* 4
说明:
运算符号和参数之间要有空格分开;
通配符号(*),在作为乘法运算符时要用\、“”、‘’符号修饰
② let命令
格式:let arg1 [arg2 …]
例子:计算(2+3)×4的值
let s=(2+3)*4
说明:
与expr命令相比,let命令更简洁直观。
运算符号和参数之间不能有空格。
当运算符中有<、>、&、|等符号时,同样需要用引号(单引号、双引号)或者斜杠来修饰运算符。
条件判断
1、常见的条件:
变量属性;
文件属性;
命令执行结果;
多种条件的逻辑组合;
2、判断结果的一般定义:
真:0
假:1
3、格式:
test condition
[ condition ] #[右边和]左边需要有空格
整数关系
逻辑运算
逻辑与-a:condition1 -a condition2,如果两个条件都为真,则结果为真。
逻辑或-o:condition1 -o condition2,如果两个条件有一个为真,则结果为真。
逻辑非!:! condition,结果与condition相反。
控制结构
控制结构: 根据某个条件的判断结果,改变程序执行的路径。可以简单的将控制结构分为分支和循环两种 。
常见分支结构: if 、case
常见循环结构: for 、while、until
If分支
说明:
小括号中的部分可省略;
当条件为真(0)时执行then后面的语句,否则执行else后面的语句;
以fi作为if结构的结束。
case分支
说明:
“条件”可以是变量、表达式、shell命令等;
“模式”为条件的值,并且一个“模式”可以匹配多种值,不同值之间用竖线(|)联结 ;
一个模式要用双分号(;;)作为结束 ;
以逆序的case命令(esac)表示case分支语句的结束
模式的匹配可以使用通配符
?:仅匹配一个字符
*:匹配任意字符
[…]:配置方括号中的任意一个字符
[!..] : 不匹配方括号中的任意字符
[a-zA-Z] : -指定一个取值范围
for循环
说明:
“列表”为存储了一系列值的列表,随着循环的进行,变量从列表中的第一个值依次取到最后一个值;
do和done之间的命令通常为根据变量进行处理的一系列命令,这些命令每次循环都执行一次;
如果中括号中的部分省略掉,Bash则认为是“in $@”,即执行该程序时通过命令行传给程序的所有参数的列表。
while/until循环
说明:
while循环中,只要条件为真,就执行do和done之间的循环命令;
until循环中,只要条件不为真,就执行do和done之间的循环命令,或者说,在until循环中,一直执行do和done之间的循环命令,直到条件为真;
避免生成死循环
break continue shift
函数
定义
引用
function_name [参数1,参数2…参数n]
说明:
中括号中的部分可以省略;
如果在函数内部需要使用传递给函数的参数,一般用$ 0、$ 1、…、$ n,以及$ #、$ *、$ @这些特殊变量 :
$0为执行脚本的文件名;
$1是传递给函数的第1个参数 ;
$#为传递给函数的参数个数;
$ *和$ @为传递给函数的所有参数
grep
$ ls -l | grep ‘^a’
通过管道过滤ls -l输出的内容,只显示以a开头的行。
$ grep ’test’ *.txt
显示所有以txt结尾的文件中包含test的行。
$ grep ‘test’ aa bb cc
显示在aa,bb,cc文件中匹配test的行。
$ grep ‘[a-z]\ {5,\ }’ aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行
grep正则表达式元字符集(基本集)
编程案例
- 设计如下⼀个菜单驱动程序,保存为: menu.sh
菜单程序将根据⽤户输⼊的选择项给出相应信息,直到输⼊Q|q才退出程序(循环),否则⼀
直提示操作信息
Use one of the following options:
P:To display current directory
S:To display the name of running file
D:To display today’s date and present time(如:2017-04-26 05:45:12)
L:To see the list of files in your present working directory
W:To see who is logged in
I:To see the ip address of this local machine
Q:To quit this program
Enter your option and hit:
要求对⽤户的输⼊忽略⼤⼩写,对于⽆效选项的输⼊给出相应提示。
要求使⽤case语句实现以上功能,输⼊相应的字⺟后应该执⾏相应的命令完成每项功能,如
输⼊P或p,就执⾏pwd命令。
#!/bin/bash
echo -n "
P:To display current directory
S:To display the name of running file
D:To display today's date and present time(如:2017-04-26 05:45:12)
L:To see the list of files in your present working directory
W:To see who is logged in
I:To see the ip address of this local machine
Q:To quit this program
"
while true
do
echo -n "Enter your option and hit:"
read option
case "$option" in
[pP])
pwd
;;
[sS])
echo $0
;;
[dD])
date "+%Y-%m-%d %H:%M:%S"
;;
[lL])
ls
;;
[wW])
whoami
;;
[iI])
ip addr
;;
[qQ])
exit 0
;;
*)
echo "you can only input 'p s d l w i q!'"
;;
esac
done
exit 1;
- 编写⼀段bash shell程序,保存为:score.sh
根据键盘输⼊的学⽣成绩,显示相应的成绩登等级,
其中
60分以下为"Failed!",
60~69分为"Passed!",
70~79分为"Medium!",
80~89分为"Good!",
90~100为"Excellent!"。
如果输⼊超过100的分数,则显示错误分数提示。
如果输⼊负数,则退出程序,否则⼀直提示⽤户输⼊成绩
#!/bin/bash
while true
do
echo -n "please input a student score:"
read score
if [ "$score" -gt 100 ];
then
echo "input error!"
elif [ "$score" -ge 90 ];
then
echo "Excellent!"
elif [ "$score" -ge 80 ];
then
echo "Good!"
elif [ "$score" -ge 70 ];
then
echo "Medium!"
elif [ "$score" -ge 60 ];
then
echo "Passed!"
elif [ "$score" -ge 0 ];
then
echo "Failed!"
else
exit 0
fi
done
- 编写⼀段bash shell程序,保存为file.sh
判断⽤户输⼊是否为有效⽬录路径。如果不是,提示该路径不是⽬录路径。如果是
,则依次输出该⽬录下的所有内容的 “⽂件路径_⽂件类型符号”形式。
直到⽤户输⼊q退出,否则⼀直提示⽤户输⼊。
#!/bin/bash
while true
do
echo -n "please input a path:"
read path
if [ -d $path ];
then
for fileName in ${path}/*
do
if [ -d $fileName ];
then
fileType="d"
else
fileType=`ls -l $fileName|cut -c1`
fi
echo "${fileName}_${fileType}"
done
elif [ $path = "q" ];
then
exit 0
else
echo "invalid directory path!"
fi
done
- 编写⼀段bash shell程序,保存为 program.sh
完成以下输出,可循环执⾏:
please,input a number:
5(回⻋)
5 4 3 2 1
4 3 2 1
3 2 1
2 1
1
#!/bin/bash
echo "please,input a number:"
read n
for((i=0;i<$n;i++));
do
for((j=n-i;j>0;j--));
do
echo -n "$j "
done
echo
done