一、Bash shell是什么
shell是什么,Bash与shell又有什么关系。(以前我也不是特别清楚~~~~)
shell 是一个交互性命令解释器。shell独立于操作系统,这种设计让用户可以灵活选择适合自己的shell。shell让你在命令行键入命令,经过shell解释后传送给操作系统(内核)执行。
shell
是一个命令处理器(command
processor)--是一个读入并解释你输入的命令的程序。除了是一个命令中断器以外,shell还是一个程序设计语言。你可以编写shell可以解
释的程序(被称为源程序),这些源程序可以包含shell程序设计命令等等。shell除了解释命令以外,还有其他工作,它也可以配置和编程。
shell拥有自己的语言允许用户编写程序并以一种复杂方式运行。shell编程语言具有许多常用的编程语言的特征,例如:循环和控制结构等。用户可以生成像其他应用程序一样复杂的shell程序。
以下是shell功能的一个汇总:
查找命令的位置并且执行相关联的程序;
为shell变量赋新值;
执行命令替代;
处理 I/O重定向和管道功能;
提供一个解释性的编程语言界面,包括tests、branches和loops等语句。
bash是borne again shell的缩写,它是shell的一种,Linux上默认采用的是bash。当然还有sh,dash,tcsh和ksh等
1、读入变量(read)
read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入。在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY。下面的列表给出了read命令的常用方式:
read | 从标准输入中读取一行并赋值给特定的变量ERPLY(没有指定变量名的话) |
read one | 从标准输入读取并赋值给变量one |
read first last | 从标准输入读取输入到第一个空格或者回车,将输入的第一个单词放到变量first中,并将该行其他的输入放在变量last中。 |
read -p | 打印提示信息,等待输入,并赋值给默认的变量REPLY |
read -t | 设置超时时间(单位:秒) |
read -a arry_name | 将输入在清单存入到"arry_name"数组中 |
read示例:
1 2 3 4 5 |
#无变量,默认存于特定变量REPLY中
|
1 2 3 4 5 |
[[email protected] apache] # read one two three
|
1 2 3 4 5 |
[[email protected] apache] # read -p "Please input your name:" name
|
1 2 3 4 |
[[email protected] apache] # read -t 4 -p "Enter your nmber:"
|
2. 状态判断:
test是Shell中提供的内置命令,主要用于状态的检验,如果结果为0,表示成功,否则表示失败。
1 2 3 4 |
[[email protected] apache] # name=scott
|
注意的是test命令不支持Shell中提供的各种通配符
1 2 3 4 |
[[email protected] apache] # name=tom
|
test命令还可以中括号予以替换,其语义保持不变
1 2 3 4 |
[[email protected] apache] # name=tom
|
在Shell中还提供了另外一种用于状态判断的方式:[[ expr ]],和test不同的是,该方式中的表达式支持通配符
1 2 3 |
[[email protected] apache]# [[ $name==[tT]om ]]
|
在[[ expression ]]中,expression可以包含&&(逻辑与)和||(逻辑或)。
1 2 3 4 |
[[email protected] apache] # friend=Jack
|
在Shell中还提供了let命令的判断方式: (( expr ))
1 2 3 4 5 6 7 8 |
[[email protected] apache] # a=45
|
下面的表格是test命令支持的操作符:
表达式 |
判断为真的条件 |
字符串判断 | 结果 |
[ StringA=String ] | StringA等于StringB |
[ StringA==StringB ] | StringA等于StringB |
[ StringA!=StringB ] | StringA不等于StringB |
[ String ] | String不为空 |
[ -z String ] | String长度为0 |
[ -n String ] | String长度不为0 |
逻辑判断 | |
[ StringA -a StringB ] | StringA和StringB都是真 |
[ StringA -o StringB ] | StringA或StringB是真 |
[ !String ] | String不为真 |
逻辑判断(复合判断) | |
[[ pattern1 && pattern2 ]] | pattern1和pattern2都是真 |
[[ pattern1 || pattern2 ]] | pattern1或pattern2是真 |
[[ !pattern ]] | pattern不为真 |
整数判断 | |
[ intA -eq intB ] | intA等于intB |
[ intA -ne intB ] | intA不等于intB |
[ intA -ge intB ] | intA大于等于intB |
[ intA -lt intB ] | intA小于intB |
[ intA -le intB ] | intA小于等于intB |
[ intA -gt intB ] | intA大于intB |
文件判断中的二进制操作 | |
[ fileA -ot fileB ] | fileA比fileB旧 |
[ fileA -ef fileB ] | fileA和fileB有相同的设备或者inode值 |
[ fileA -nt fileB ] | fileA比fileB新 |
文件检验 | |
[ -d $file ] or [[ -d $file ]] | file为目录且存在时为真 |
[ -e $file ] or [[ -e $file ]] | file为文件且存在时为真 |
[ -f $file ] or [[ -f $file ]] | file为非目录普通文件存在时为真 |
[ -s $file ] or [[ -s $file ]] | file文件存在, 且长度不为0时为真 |
[ -L $file ] or [[ -L $file ]] | file为链接符且存在时为真 |
[ -r $file ] or [[ -r $file ]] | file文件存在且可读时为真 |
[ -w $file ] or [[ -w $file ]] | file文件存在且可写时为真 |
[ -x $file ] or [[ -x $file ]] | file文件存在且可执行时为真 |
[ -S $file ] or [[ -S $file ]] | 测试文件是否存在在并且是否是一个套接字文件 |
[ -h $file ] or [[ -h $file ]] | file为链接符且存在时为真 |
[ -p $file ] or [[ -p $file ]] | 测试文件是否存在并且是否是一个管道文件 |
注:在逻辑判断(复合判断中),pattern可以包含元字符,在字符串的判断中,pattern2必须被包含在引号中。
3.流程控制语句:
if语句格式如下:
if语句的后面是Shell命令,如果该命令执行成功返回0,则执行then后面的命令。
if command;then
command
command
fi
用test命令测试其后面expression的结果,如果为真,则执行then后面的命令。
if test expression
then
command
fi
下面的格式和test expression等同
if [ string/numeric expression ]
then
command
fi
下面的两种格式也可以用于判断语句的条件表达式,而且它们也是目前比较常用的两种。
if [[ string expression ]]
then
command
.........
fi
if (( numeric expression ))
then
command
.......
fi
示例:
1 2 3 4 5 6 7 8 9 10 11 |
[[email protected] tmp] # cat test2.sh
|
上面的判断还可以替换为:
1 2 3 4 5 6 7 8 9 10 |
[[email protected] tmp] # cat test2.sh
|
1 2 3 4 5 6 7 8 9 10 11 |
[[email protected] tmp] # cat test3.sh
|
if/elif/else语句的使用方式和if语句极为相似,其格式如下:
if command
then
command
elif command
then
command
else
command
fi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[[email protected] tmp] # cat test4.sh
|
=======================================完================================================