shell入门教程(1)-shell基础

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

!

其中的符号!用以界定输入信息的结束,中间的文本都作为命令的输入。

注意结束的符号需要写在一行的开头,前面不能添加<TAB>或空格。

符号的表示方式不是强制的,只要配对即可,你可以使用任何你喜欢的字符或字符串

如果采用下面的方式,也就是在符号之前添加了一个-,此时结束符号不需要顶头书写,前面可以添加<TAB>但是依然不能添加空格

cat <<-!

shell会删除文本中的<TAB>字符

说明:<<之前也可以添加描述符。

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]*  显示所有以字母ab打头的文件名称

ls [a-z]* 显示所有以小写字母打头文件名称

4、字符--[]搭配使用,表示反向匹配

ls [!a]*  显示所有不是以字母a打头的文件名称

5、字符--明确指定匹配.打头的文件名称

ls .[a-c]  显示所有以.a/.b/.c打头的文件名称

6、复合模式

*(pattern)  模式重复0或多次

?(pattern)  模式重复01

+(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、直接文件输入,格式为:$(<file)

整体替换为文件内容,如:

X=$(<foo定义一个变量,赋值为文件foo的内容

4、算术运算,$((arithmetic-expression))

如:echo $((3*9))

 

六、波浪号~替换

展开为当前用户的HOME目录

~user  展开为特定用户userHOME目录

~-  展开为前一个目录,即$OLDPWD

~+  展开为当前目录,即$PWD

cd -  切换到之前的目录

试验,并观察结果:

cd /tmp

cd ~root

cd -

再一次cd -

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值