shell入门教程(1)-shell基础 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/43795131
shell入门教程(2)-变量和参数 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/44081993
shell入门教程(3)-命令编辑 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/44617445
shell入门教程(4)-作业控制 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/46801163
SHELL入门教程(5)-算术运算 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/47025297
SHELL入门教程(6)-环境 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/47025321
SHELL入门教程(7)-编写脚本 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/47025397
一、简单脚本文件
1、用 vi或其他编辑器把下面的两行写入一个文件,命名为1.sh。
echo "We have these files:"
ls
2、这就是一个简单的脚本文件,为其添加执行权限:
chmod +x 1.sh
3、执行(前面的./指定当前目录,意思是明确指定执行当前目录下的1.sh文件)
./1.sh
观察屏幕输出结果。
看,一个简单的脚本文件就是这样。
二、过程执行
1、单行多命令
可以在一行中指定多个待执行的命令,采用分号分隔,多个命令将依次执行。如:
ls;date;pwd
2、命令续行
如果在行尾输入反斜线\,可以在下一行继续整个命令的输入,如:
echo a b \
> c
其中的> 是SHELL给出的命令续行符号。最后整个命令的输出结果是a b c
3、后台执行
在命令的结尾添加符号&,此时命令将在后台执行。你不用等待当前命令执行结束就可以输入新的命令。通常用于执行耗时很长的命令。如:
sleep 10 &
这个命令会睡眠10秒钟,在这个命令后台执行的同时,你可以继续在前台执行其他的命令。
4、管道
表示符号是竖线|,可以串接两个命令,前面命令的输出将作为后面命令的输入,如:
ls|wc –l
wc命令用以统计输入行数,那么整个命令的效果就是统计当前目录下的文件数目。
5、条件执行
如果使用&&串接两个命令,那么只有前面命令执行成功时,后面的命令才得以执行。如:
ls 1.sh && echo "file 1.sh is here "
因为1.sh存在,后面的echo命令得以执行,并输出信息file 1.sh is here
如果删除1.sh文件(rm 1.sh),再次执行上面的串接命令,你会发现echo命令不再执行。
相反,如果使用||串接两个命令,那么只有前面命令执行失败时,后面的命令才得以执行。
思考,command1 && command2 || command3
command1执行成功时,command2执行,而command3不执行。
command1执行失败时,command2不执行,而command3执行。
6、命令组合
可以使用一对{}或()组合命令,组合的命令整体上作为单个命令来看待。
比较下面两行命令的输出结果,并分析:
echo 123;echo 456|wc –l
{ echo 123;echo 456;}|wc –l
注意格式要求,{后面必须有空白字符,}前面必须有一个分号。
{}分组的命令在当前shell中执行,而()分组的命令在子shell中执行。
子shell是当前shell克隆的一个副本,其执行结果不会影响当前shell。
子shell的概念后面详述。
三、IO重定向
1、重定向标准输出
命令的执行结果通常输出到屏幕,可以使用>符号重定向到文件中,如:ls>flist
命令执行之后,屏幕不再显示输出信息,而文件flist的内容将包含当前目录下的文件列表。
如果文件flist之前不存在,将被创建;如果之前存在,其内容将被覆盖。
可以直接使用>创建一个空的文件,如:
> a_new_file
可以使用>>实现追加重定向,输出结果追加写入文件,如:ls >>flist
noclobber选项
禁止重定向到一个已经存在的文件,这个选项默认是关闭的。可以使用下面的命令打开:
set -o noclobber
此时再次尝试重定向时将报错:cannot overwrite existing file
ls > flist
但是依然可以强制重定向,忽视这个选项的设置,如:ls>|flist
2、重定向标准输入,通过符号<使用文件的内容作为命令的输入信息,如:cat < flist
3、文件描述符
程序使用文件描述符来标识打开的文件,shell自动为程序打开了3个描述符,0,1,2
0表示标准输入 1表示标准输出 2表示标准错误输出
说明:标准错误输出默认也是对应到屏幕,但是与标准输出不同,通常用以输出错误信息。
重定向错误输出,在符号>之前添加描述符2(注意2和>之间没有间隔),假定文件aa不存在:
ls aa 2>err.out
也就是说,在符号>之前可以添加描述符,省略则隐含是1。
ls aa bb >myout 2>&1
错误输出与标准输出都重定向到文件myout中,也就是合并了两个描述符的输出信息。
4、嵌入文本
cat <
aa
bb
!
其中的符号!用以界定输入信息的结束,中间的文本都作为命令的输入。
注意结束的符号需要写在一行的开头,前面不能添加
符号的表示方式不是强制的,只要配对即可,你可以使用任何你喜欢的字符或字符串。
如果采用下面的方式,也就是在符号之前添加了一个-,此时结束符号不需要顶头书写,前面可以添加
cat <<-!
shell会删除文本中的
说明:<<之前也可以添加描述符。
5、丢弃标准输出
ls >/dev/null
ls aa bb >/dev/null 2>&1
后者同时丢弃标准输出与标准错误输出。
/dev/null是一个特殊设备,可以看做一个黑洞。
四、文件名称替换
1、字符* --匹配0或多个字符
单独使用时匹配当前目录下的所有文件(以小数点.打头的文件名称除外)。
ls a* 显示所有以字母a打头的文件名称
ls *b 显示所有以字母b结尾的文件名称
2、字符? --精确匹配一个字符
ls ?? 显示两个字符的文件名称
3、字符[] --匹配一个范围
ls [ab]* 显示所有以字母a或b打头的文件名称
ls [a-z]* 显示所有以小写字母打头的文件名称
4、字符! --与[]搭配使用,表示反向匹配
ls [!a]* 显示所有不是以字母a打头的文件名称
5、字符. --明确指定匹配.打头的文件名称
ls .[a-c] 显示所有以.a/.b/.c打头的文件名称
6、复合模式
*(pattern) 模式重复0或多次
?(pattern) 模式重复0或1次
+(pattern) 模式重复1或多次
@(pattern) 模式重复1次
!(pattern) 模式排除
例如:ls *(a) 显示所有的a重复任意次数的文件名称
7、禁止文件名称替换
set -f 或 set -onoglob
此时特殊字符* ?等失去其特殊含义,仅仅表示字符本身。
五、命令替换
1、原地展开命令的输出信息,通常用以为变量赋值,或在命令中嵌入另一个命令的输出。
格式为:$(command),示例:
a=$(date +“%Y%m%d”) 定义一个变量,赋值为当天的日期
echo "today is $(date +"%Y%m%d")“
2、或者采用兼容格式:`command`
注意其中的符号是键盘上数字1左边的那个字符
3、直接文件输入,格式为:$(
整体替换为文件内容,如:
X=$(
4、算术运算,$((arithmetic-expression))
如:echo $((3*9))
六、波浪号~替换
~ 展开为当前用户的HOME目录
~user 展开为特定用户user的HOME目录
~- 展开为前一个目录,即$OLDPWD
~+ 展开为当前目录,即$PWD
cd - 切换到之前的目录
试验,并观察结果:
cd /tmp
cd ~root
cd -
再一次cd -