转自:http://blog.chinaunix.net/u3/93926/showart_1874897.html

●为什么使用Shell编程?

简单快捷,适用性广
●什么是Shell?
Shell是用户和Linux系统之间的接口程序,你可以通过它输入命令以使操作系统执行。
●文件描述符0,1,2分别表示什么?
在Shell中, 0表示标准输入,1表示标准输出,2表示标准错误输出。
●>>符号的作用?
在文件后添加时,使用>>,如:ps >> output.txt,这样ps的结果会添加在output.txt文件的最后,而不会冲掉文件中原有的内容。
●Shell命令中常见2>&1,这是什么意思?
在Shell中,>符号常用来表示重定向输出,前面可用文件描述符表示重定向什么输出,默认为1(即标准输出),如果是重定向标准错误输出,则使用2>,后面如果为&1,则表示将标准错误输出重定向到与标准输出的同一位置。
●/dev/null的作用?
如果在Shell命令中,你希望把输出的结果丢弃,那么可以直接扔到Linux的垃圾桶里,/dev/null就是这样一个垃圾桶。例如:kill -l 214 > /dev/null
●怎样重定向输入?
在shell中重定向输入使用的是<符号,例如:more < ex.txt
●为什么需要管道?管道怎么使用?
Shell中管道(pipe)功能很强大,可用来链接命令,实现流水线操作。管道这个名字很形象,它就是命令之间的连接渠道。在使用管道时,你把前一个命令的输出和后一个命令的输入对应地接在一起就行了,使用的符号是“|”。例如:ps | sort | grep -v init | more
●Shell中的通配符
Shell中的通配符功能也挺强大的,主要有如下几类:
1)*:匹配任意字符
2)?:匹配单个字符
3)[集合]:匹配集合中的字符
4)[^集合]:匹配不在集合中的字符
5){}:匹配{}中的内容
●` `符号的作用
在Shell中,一对` `符号表示把包含其中的内容以Shell命令的方式执行,注意与普通引号之间的差别。例如:more `grep -l POSIX *`
●关于Shell脚本的写法
Shell脚本的编写需要注意如下基本要点:
1)第一行以注释开始,实际上这是一行特殊的注释,#!表示其后列出的是执行该脚本的程序,例如:#!/bin/bash,表示该脚本用/bin/bash程序来解释执行。
2)最后一行使用exit命令结束,以确保脚本能以正常方式退出。
●给Shell脚本赋予执行权限
刚编辑好的Shell脚本是不能直接运行的,如果你希望通过./shellfile的方式运行它,就需要给脚本赋予执行权限,通常的做法是:chmod +x shellfile,也可以根据不同的权限要求,对指定的用户授予权限,如:chmod 766 shellfile(另一种格式:chmod o+x shellfile),则该shellfile文件只有其所有者用户(owner)才能直接执行。

●Shell中变量的表示方法是什么?
在Shell中,一般在名字前加$表示变量,例如:
$ first = Hello
$ echo $first
Hello
●Shell中可否直接从标准输入读入变量?
答案是肯定的,而且实现的方法也很简单,用read命令就好,例如:
$ read yourname
Wang Tian
$ echo $yourname
Wang Tian
●Shell中引号使用时的注意事项是什么?
在Shell中使用单引号和双引号要特别注意如下一个区别:单引号所包含的字符串里若含有变量($var),不作替换处理,而双引号所包含的字符串则会自动进行变量的替换。例如:
$ myname = “Li Xi”
$ echo “My name is $myname.”
My name is Li Xi.
$ echo ‘My name is not $myname.”
My name is not $myname.
●Shell中的环境变量有哪些?它们各有什么作用?
环境变量在实际Shell编程中广泛使用,是需要重点掌握的。现在只介绍几个主要的常用的变量:
1)$HOME    当前用户的主目录
2)$PATH         命令的搜索路径
3)$PS1            命令提示符,就是你在Linux命令行下那个总出现的提示符,通常是$,也可能定制成其他类型。
4)$PS2            第二命令提示符,比如当你输入的命令需要接受输入时,也会给出一个提示符,通常为>
5)$IFS             输入字段分隔符,就是当你读入信息时用来将字符串分隔为单词的符号,通常为空格、制表符以及回车符号。
6)$0                所执行的Shell脚本的名字
7)$#                Shell脚本(命令)传递的参数个数
8)$$                所执行的Shell脚本的进程号,通常用来生成唯一的临时文件名
●Shell中的参数变量有哪些?它们各有什么作用?
参数变量与环境变量同样重要,当你编写的脚本需要调用参数时,系统会自动为你创建这些参数变量,如果不需要传递参数,上面的环境变量$#的值会设为0。参数变量比较简单,就有三个而已:
1)$1, $2, …             传递给脚本的参数1,2,…
2)$*                          所有参数的一个列表,参数之间用IFS中所定义的第一个分隔符分隔
3)$@                        $*的一个变种,它不使用IFS环境变量的分隔符,即使IFS为空,也不影响其表示。所以这是比$*更好的一种表示方式。

●Shell中的布尔测试命令是什么?其用法怎样?
Shell中的布尔测试与一般编程语言有所不同,有两个命令可以表示(它们其实是同一个命令,只是表示方法不同而已):test和[(这不是左括号吗?也算命令吗?答案是肯定的,不信你可以去检查ls -l /usr/bin/[。还要注意一点的是,通常使用[表示时,会在测试完成后加上一个],其实这只是为了可读性而增加的,没有实际意义)。例如:
if test –f my.txt 和 if [ -f my.txt ] 都表示测试文件my.txt是否存在。(注意[与-f之间必须有空格)
使用布尔测试符测试的条件类型包含三类:字符串测试/算术测试/文件测试,具体分为:
1)字符串测试
①string1 = string2           测试两字符串是否相等
②string1 != string2                   测试两字符串是否不等
③-n string                          测试字符串是否不为空
④-z string                           测试字符串是否为空
2)算术测试
①expr1 -eq expr2             测试两表达式是否相等
②expr1 -ne expr2             测试两表达式是否不等
③expr1 -gt expr2             测试expr1是否大于expr2
④expr1 -ge expr2             测试expr1是否大于等于expr2
⑤expr1 -lt expr2               测试expr1是否小于expr2
⑥expr1 -le expr2              测试expr1是否小于等于expr2
⑦!expr                                测试表达式是否为假
3)文件测试
①-d file                                测试该文件是否为目录
②-e file                                测试该文件是否存在,但该选项可移植性不好,通常改用-f
③-f file                                 测试该文件是否为常规文件
④-g file                                测试该文件是否设置了set-group-id
⑤-r file                                测试该文件是否可读
⑥-s file                                测试该文件是否不空
⑦-u file                                测试该文件是否设置了set-user-id
⑧-r file                                测试该文件是否可写
⑨-x file                                测试该文件是否可执行
●Shell中的条件控制结构是怎样的?
编程语言中的条件控制结构通常是if..then之类的,Shell也不例外。其格式如下:
if 条件1
then
  语句A
elif 条件2
then 
语句B
elif 条件3
then
  语句C
else
  语句D
fi
●Shell中的循环控制结构是怎样的?
Shell中的循环结构也与其他编程语言类似。基本格式如下:
1)for循环(适于在字符串集中循环,注意其与通常的for语句的差别)
for 变量 in 值集   
do
  语句
done
2)while循环(适于在数集中循环或条件测试)
while 条件 do
  语句
done
3)until语句(与while的条件判断正好相反)
until 条件
do
  语句
done
●关于case语句的用法是怎样?
case的结构比较复杂,所以在这里单列出来。其基本格式为:
case 变量 in
  模式 [ | 模式] …) 语句A;;
  模式 [ | 模式] …) 语句B;;
  …
esac
看个例子吧:
case “$dayofweek” in
  1) echo “Today is Monday”;;
  2) echo “Today is Tuesday”;;
  3) echo “Today is Wednesday”;;
  4) echo “Today is Thursday”;;
  5) echo “Today is Friday”;;
  6) echo “Today is Saturday”;;
  7) echo “Today is Sunday”;;
  *) echo “Sorry, your input is wrong!”;;
esac

●Shell中的语句链表是怎样的?
Shell中有一项比较特殊的用法,就是将多个语句串联在一起,这样可以使编程更为简洁。这些语句的串联通常是条件测试语句,一般用两个符号来组织它们:&&(表示与)和||(表示或)。&&链表可以连接一组命令,当&&前面的命令都成功时,才执行&&后面的命令。而||链表则当其中一条命令成功时,即退出。这两个符号甚至还可以链接语句集,只要你把这些语句用{}包围就好了。
●在Shell中怎么使用函数?
Shell中的函数定义很简单,基本格式为:
函数名()
{
  语句体
}
函数的使用需要注意的几点:
1)函数必须先定义才能调用
2)当函数调用的时候,原来脚本的参数,如$*,$@,$#,$1,$2等会被函数的相应参数所替换,函数调用完成,它们的值则回归到原值。
3)在函数内部,可以使用local来定义局部变量,该变量仅在函数内部有效。如果局部变量与全局变量同名,局部变量会在函数内部替换全局变量。
●Shell中是否也有break命令,是否也有continue命令?
答案是肯定的,和其他编程语言一样,break用来直接跳出for, while或until循环,而continue用来跳出for, while或until的当前循环。
●Shell中出现:在单独一行是什么意思?
有时我们可以看到,Shell脚本中出现一行仅包括一个冒号,它的意思其实很简单,这个冒号就等于布尔变量true。实际上,它运行的速度比true还快。
●Shell中的.做什么用?
别小看这个.符号,它实际很有用处,这是Shell中一个特殊的命令符,用来在指定Shell脚本环境里执行命令(脚本)。这有点类似于C中的#include,它可以切换到某个脚本环境下来执行后续命令。其使用方法为:. ./script
●Shell中eval命令的作用?
eval命令用来求值。它会给出后面所接变量的值,这在多次赋值时很有用。
●Shell中exec命令的作用?
exec也是Shell中常用的命令,一般有两个作用:
1)用不同的程序名替换当前Shell脚本(主要功能)
2)修改当前文件描述符(次要功能)
●关于exit的用法还有什么?
我们常见的exit用来退出脚本运行,exit 0表示成功退出,如果在exit后面加状态码1-125则表示有错误发生,这些错误可由程序指定,另外Shell还保留了一些状态码:
1)126                       文件不能执行
2)127                       命令未找到
3)128及以上        收到一个信号
●Shell中export命令的作用?
export命令的主要作用是导出环境变量,使得该环境变量能被其他脚本和程序所用。
●Shell中expr命令的作用?
expr的主要作用是将其后的参数看作表达式来求值。它可以完成许多表达式的运算。

●Shell中关于set这个命令的用法是怎样的?
set这个命令主要用来设置参数变量,这在输出以空格分隔的值时很有用。
●Shell中关于shift这个命令的用法是怎样的?
顾名思义,shift命令是用来移位的,具体来说,它可以让参数变量向后移1位,比如,$2变成$1,$3变成$2,等等。需要注意的是,移位一次都会丢掉一个参数值。
●Shell中关于trap这个命令的用法是怎样的?
trap命令用来指定当接收到某种信号时采取什么行动,可用来处理中断信息。其基本格式为:
trap 命令动作 信号
最常用的几种信号:
1)HUP(1)                          挂起;通常当终端断开连接时,或用户退出登录时发生。
2)INT(2)                            中断;通常在键入Ctrl+C时发生。
3)QUIT(3)                         退出;通常在键入Ctrl+\时发生。
4)ABRT(6)                        放弃;通常因遇到某种严重执行错误时发生。
5)ALRM(14)                     警告;通常由于计时器超时而发生。
6)TERM(15)                     终止;通常当系统关闭时发生。
如果将trap设置为默认动作,可以在命令处设置为-,如果要忽略该信号,可将命令设置为空串’ ‘。
●Shell中关于unset这个命令的用法是怎样的?
unset命令用来在环境变量表中删除一个变量,它对系统定义的只读变量没有作用。
●在Shell中出现$((…))是什么意思?
$((…))的表示是与expr同义的,用于表达式求值,但是它比expr更新,效率也更高。例如:
x=0
x=$(($x+1))
注意其与$(…)的区别,$(…)是用来得到括号内所执行的命令的输出结果。
●在Shell中什么是参数扩展(Parameter Expansion)?
参数扩展是Shell中比较有特色的一项内容,它为参数的设置提供了额外的方法。通常形式是${参数}。常用的方法有:
1)${param:-default}      如果param为空,则设置其值等于default。
2)${#param}                    求得param的长度。
3)${param%word}         从末尾开始,删除param中与word匹配的最近部分,然后返回其余。
4)${param%%word}      从末尾开始,删除param中与word匹配的最远部分,然后返回其余。
5)${param#word}          从起首开始,删除param中与word匹配的最近部分,然后返回其余。
6)${param##word}        从起首开始,删除param中与word匹配的最远部分,然后返回其余。
●在Shell中<<有什么特殊作用?
注意这个<<,它的作用很有意思,其后跟随的是一个特殊的字符序列,此后的内容就看作是从文件或键盘输入的一样,在这些内容的末尾再加上一个与开头相同的字符序列。这在Shell中称为“here document”。例如:
cat <<!nomeaning!
This is my book
!nomeaning!
输出为:
This is my book

Linux上的Shell之FAQ相关推荐

  1. linux 定时执行搅拌,Linux上定时shell脚本

    本文主要介绍在Linux系统上部署定时器,定时执行shell脚本,通过脚本执行sql文件 sql文件 -- 创建表 create table if not exists iot_test.iot_ta ...

  2. linux 火狐无法执行二进制文件_尝试在Linux上运行Shell脚本时“无法执行二进制文件”...

    我对linux和shell编写非常陌生.我正在尝试使用以下命令从linux上的安全shell(ssh)运行shellscript: chmod +x path/to/mynewshell.sh sh ...

  3. linux 中输入bash,Linux上Bash Shell编程

    Linux下Bash Shell编程 Bash Shell Programming in Linux Linux下Bash Shell编程 Bash what? 进阶的内容是什么? Okay, I g ...

  4. 无法执行二进制文件linux,尝试在Linux上运行Shell脚本时“无法执行二进制文件”...

    我对linux和shell编写非常陌生.我正在尝试使用以下命令从linux上的安全shell(ssh)运行shellscript: chmod +x path/to/mynewshell.sh sh ...

  5. linux上安装shell编辑器与linux运维面试题

    分两个部分 一.安装B-shell解释器 安装cygwin  Eclipse要找到安装的bin路径 https://cygwin.com 二.安装编辑器shellEd 下载可以得到一个:net.sou ...

  6. Linux上使用shell脚本查看内存情况(超实用)

    #!/bin/bash# tomcat启动程序(这里注意tomcat实际安装的路径) StartTomcat=/wls/jenkins/apache-tomcat-6.0.39/bin/startup ...

  7. python脚本在linux上运行的两种方式_python脚本当作Linux中的服务启动实现方法

    脚本服务化目的: python 在 文本处理中有着广泛的应用,为了满足文本数据的获取,会每天运行一些爬虫抓取数据.但是网上买的服务器会不定时进行维护,服务器会被重启.这样我们的爬虫服务就无法运行.这个 ...

  8. loadrunner11 linux服务器,Loadrunner怎么执行linux服务器上的shell脚本?

    java是可以执行shell脚本的,如下: //command就是你在linux上执行脚本的字符串命令 StringBuffer command = new StringBuffer(); comma ...

  9. Linux上用Jenkins执行shell

    目录 安装Jenkins Jdk安装 安装Jenkins 打开防火墙 自定义指定端口9000启动jenkins 浏览器登录 修改管理员密码 创建一个执行shell的任务 构建刚创建的Jenkins任务 ...

最新文章

  1. 高中计算机个人总结怎么写,毕业生自我总结范文
  2. Lock wait timeout exceeded; try restarting......
  3. jdk5.0新特性—— 枚举
  4. 002_推箱子-关卡数据
  5. 项目由于装运点不同交货拆分解决方案
  6. [云炬创业基础笔记]第九章企业的法律形态测试8
  7. Java注释Override、Deprecated、SuppressWarnings详解
  8. linux开启多少到多少端口命令,Linux端口命令
  9. Mysql设置某字段唯一
  10. python 八大排序_python-打基础-八大排序
  11. 安装成功后python报错_python安装mysql的依赖包mysql-python操作
  12. 信号-失真噪声比 (SNDR) 无杂散动态范围 (SFDR)
  13. java毕业设计宿舍管理系统mybatis+源码+调试部署+系统+数据库+lw
  14. 盲源分离(BSS)的学习总结(PCA、ICA)
  15. python 正则匹配指定号段手机号
  16. PHP僵尸网络,byob--建立自己的僵尸网络
  17. 面试前应该怎么准备面试过程才不会紧张呢
  18. android酷炫转圈动画,android常用旋转线条加载动画
  19. [2017集训队作业自选题#149]小c的岛屿
  20. python爬虫——智联招聘(上)

热门文章

  1. Linux带给了我什么?
  2. GlusterFS架构与维护
  3. vue实例以及生命周期
  4. WPF中将16进制颜色码转换成SolidColorBrush
  5. 春风十里不如春城一聚:华平解决方案巡展走进昆明
  6. redhat Nginx 安装
  7. Css 特殊或不常用属性
  8. route map应用策略路由(下)
  9. matlab在linux下面的相对路径的写法
  10. 错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster