Shell的作用是解释执行用户的命令。Shell解释执行单条命令的这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令。UNIX系统上有很多版本的Shell,bash是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。
Shell脚本中用#表示注释,相当于C语言的//注释。但位于第一行开头的#! 例外,它表示该脚本使用后面指定的解释器/bin/sh解释执行。每个脚本程序必须在开头包含这个语句。
在/etc/shells文件中给出系统已知的Shell,可cat /etc/shells 查看:
#/etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
dirname表示取文件的目录,basename表示取文件名
[root@web ~]# basename /usr/bin/sort
sort
[root@web ~]# dirname /usr/bin/sort
/usr/bin
${bash_source[0]} 永远表示当前文件,$0表示最后一次执行的脚本
参考:linux中${bash_source[0]}和$0的区别
a="hello world!"
echo $a
* | 匹配0个或多个任意字符 |
---|---|
? | 皮配一个任意字符 |
[若干个字符] | 匹配方括号中任意一个字符的一次出现 |
由反引号[Esc下面那个键]``括起来的或者&()括起来的也是一条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中
使用时注意:
if [ -f $a ];then
echo "hello world!"
fi
if [ -f $a ]是第一条,then echo "hello world!"是第二条,fi是第三条。如果两条命令写在同一行则需要用;号隔开,一行只写一条命令就不需要写;号了,另外,then后面有换行,但这条命令没写完,Shell会自动把下一行接在then后面当作一条命令处理。和[命令一样,要注意命令和各参数之间必须用空格隔开。if命令的参数组成一条子命令,如果该子命令的Exit Status为0(表示真),则执行then后面的子命令,如果Exit Status非0(表示假),则执行elif、else或者fi后面的子命令。if后面的子命令通常是测试命令,但也可以是其它命令。Shell脚本没有{}括号,所以用fi表示if语句块的结束
case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语言的case只能匹配整型或字符型常量表达式,而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。
case “$var” in
conditionl )
statments1;;
conditionl )
statment2;;
* ) default statements;;
esac
注意:
for/do/done使用规则:
for var in list
do
statement
done
其中,var是要列举的变量,list是变量var的一个集合,do…done中的语句是需要执行的语句。使用时需要注意:
for a in $(ls /home/www/)
do
if [ -f $a ]
iconv -f utf-8 -t gbk $a
fi
done
当/home/www下的文件或者目录未被列举完时,若检索到的当前变量a为文件,则把所有的utf-8编码的文件转换为gbk编码。
#! /bin/sh
COUNTER=1
while [ "$COUNTER" -lt 10 ]; do
echo "Here we go again"
COUNTER=$(($COUNTER+1))
done
Shell还有until循环,类似C语言的do…while循环
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。
和C语言类似,Shell中也有函数的概念(用set命令可以查看到内置函数),但是函数定义中没有返回值也没有参数列表。如:
#! /bin/sh
foo() { echo "Shell bash function is called"; }
echo "---start--"
foo
echo"---end--"
注意:
#!/bin/bash
square(){
let "res=$1*$1"
return $res
}
square $1 #$1表示第一个实参 5
result=$?
echo $result
exit 0
执行:sh funtest.sh 5 返回:25
除了分号,Bash 还提供两个命令组合符&&和||,允许更好地控制多个命令之间的继发关系。
echo命令显示内容的时候,若是单行内容显示,可以直接跟要显示的内容,也可以用单双引号括起来;若是多行显示,必须要引号括来(单双都可以)
#直接跟内容
Robin-macbook-pro:~ robin$ echo hello world
#结果:
hello world
#用单引号括起来
Robin-macbook-pro:~ robin$ echo 'today is Monday,
> termorrow is Tuesday,
> and the day after termorrow is Thursday.'
#结果:
today is Monday,
termorrow is Tuesday,
and the day after termorrow is Thursday.
echo 必须使用参数 -e 解释特殊字符
Robin-macbook-pro:~ robin$ echo "I\nLOve\nU"
I\nLOve\nU
Robin-macbook-pro:~ robin$ echo -e "I\nLOve\nU"
I
LOve
U
ctrl + l:清除屏幕并将当前行移到页面顶部
ctrl + c:中止当前正在执行的命令
ctrl + a:移动光标到行首
ctrl + e:移动光标到行尾
ctrl + u:从光标位置删除到行首
ctrl + k:从光标位置删除到行尾
ctrl + d:关闭 Shell 会话
↑、↓:向上和下浏览已执行命令的历史记录