Shell十三问-ChinaUnix精华贴整理
转自ChinaUnix1) 为何叫做shell ?在介绍shell 是甚么东西之前,不妨让我们重新查看用户与计算机系统的关系:图(FIXME)我们知道计算机的运作不能离开硬件,但用户却不能直接对硬件作驱动,硬件的驱动只能通过一个称为"操作系统(Operating System)"的软件来控管,事实上,我们每天所谈的linux ,严格来说只是一个操作系统,我们称之为"核心(kernel)"。
然而,从用户的角度来说,用户也没办法直接操作kernel ,而是通过kernel 的"外壳"程序,也就是所谓的shell ,来与kernel 沟通。
这也正是kernel 跟shell 的形像命名关系。
如图:图(FIXME)从技术角度来说,shell 是一个用户与系统的交互界面(interface),主要是让用户通过命令行(command line)来使用系统以完成工作。
因此,shell 的最简单的定义就是---命令解释器(Command Interpreter):* 将用户的命令翻译给核心处理,* 同时,将核心处理结果翻译给用户。
每次当我们完成系统登录(log in),我们就取得一个交互模式的shell ,也称为login shell 或primary shell。
若从进程(process)角度来说,我们在shell 所下达的命令,均是shell 所产生的子进程。
这现像,我们暂可称之为fork 。
如果是执行脚本(shell script)的话,脚本中的命令则是由另外一个非交互模式的子shell (sub shell)来执行的。
也就是primary shell 产生sub shell 的进程,sub shell 再产生script 中所有命令的进程。
(关于进程,我们日后有机会再补充。
)这里,我们必须知道:kernel 与shell 是不同的两套软件,而且都是可以被替换的:* 不同的操作系统使用不同的kernel ,* 而在同一个kernel 之上,也可使用不同的shell 。
在linux 的缺省系统中,通常都可以找到好几种不同的shell ,且通常会被列与如下文件里:/etc/shells不同的shell 有著不同的功能,且也彼此各异、或说"大同小异"。
常见的shell 主要分为两大主流:sh:burne shell (sh)burne again shell (bash)csh:c shell (csh)tc shell (tcsh)korn shell (ksh)(FIXME)大部份的Linux 系统的缺省shell 都是bash ,其原因大致如下两点:* 自由软件* 功能强大bash 是gnu project 最成功的产品之一,自推出以来深受广大Unix 用户喜爱,且也逐渐成为不少组织的系统标准。
2) shell prompt(PS1) 与Carriage Return(CR) 的关系?当你成功登录进一个文字界面之后,大部份情形下,你会在荧幕上看到一个不断闪烁的方块或下划线(视不同版本而别),我们称之为*光标*(cursor)。
光标的作用就是告诉你接下来你从键盘输入的按键所插入的位置,且每输如一键光标便向右边移动一个格子,若连续输入太多的话,则自动接在下一行输入。
假如你刚完成登录还没输入任何按键之前,你所看到的光标所在位置的同一行的左边部份,我们称之为*提示符号*(prompt)。
提示符号的格式或因不同系统版本而各有不同,在Linux 上,只需留意最接近光标的一个可见的提示符号,通常是如下两者之一:$:给最终用户帐号使用#:给root (管理员)帐号使用事实上,shell prompt 的意思很简单:* 是shell 告诉用户:您现在可以输入命令行了。
我们可以说,用户只有在得到shell prompt 才能打命令行,而cursor 是指示键盘在命令行所输入的位置,用户每输入一个键,cursor 就往后移动一格,直到碰到命令行读进CR(Carriage Return,由Enter 键产生)字符为止。
CR 的意思也很简单:* 是用户告诉shell:老兄你可以执行我的命令行了。
严格来说:* 所谓的命令行,就是在shell prompt 与CR 字符之间所输入的文字。
(思考:为何我们这里坚持使用CR 字符而不说Enter 键呢?答案在后面的学习中揭晓。
)不同的命令可接受的命令行格式或有不同,一般情况下,一个标准的命令行格式为如下所列:command-name options argum ent若从技术细节来看,shell 会依据IFS(Internal Field Seperator) 将comm and line 所输入的文字给拆解为"字段"(word)。
然后再针对特殊字符(meta)先作处理,最后再重组整行command line 。
(注意:请务必理解上两句话的意思,我们日后的学习中会常回到这里思考。
)其中的IFS 是shell 缺省使用的字段分隔符号,可以由一个及多个如下按键组成:* 空白键(White Space)* 表格键(Tab)* 回车键(Enter)系统可接受的命令名称(command-name)可以从如下途迳获得:* 明确路径所指定的外部命令* 命令别名(alias)* 自定功能(function)* shell 内置命令(built-in)* $PATH 之下的外部命令每一个命令行均必需含用命令名称,这是不能缺少的。
3) 别人echo、你也echo ,是问echo 知多少?承接上一章所介绍的 command line ,这里我们用echo 这个命令加以进一步说明。
温习---标准的command line 包含三个部件:* command_name option argumentecho 是一个非常简单、直接的Linux 命令:* 将argument 送出至标准输出(STDOUT),通常就是在监视器(monitor)上输出。
(注:stdout 我们日后有机会再解说,或可先参考如下讨论:/forum/viewtopic.php?t=191375 )为了更好理解,不如先让我们先跑一下echo 命令好了:CODE:$ echo$你会发现只有一个空白行,然后又回到shell prompt 上了。
这是因为echo 在缺省上,在显示完argument 之后,还会送出一个换行符号(new-line charactor)。
但是上面的comm and 并没任何的argument ,那结果就只剩一个换行符号了...若你要取消这个换行符号,可利用echo 的-n option :CODE:$ echo -n$不妨让我们回到command line 的概念上来讨论上例的echo 命令好了:* command line 只有command_name(echo) 及option(-n),并没有任何argument 。
要想看看echo 的argument ,那还不简单!接下来,你可试试如下的输入:CODE:$ echo first linefirst line$ echo -n first linefirst line $於上两个echo 命令中,你会发现argument 的部份显示在你的荧幕,而换行符号则视-n option 的有无而别。
很明显的,第二个echo 由於换行符号被取消了,接下来的shell prompt 就接在输出结果同一行了... ^_^事实上,echo 除了-n options 之外,常用选项还有:-e :启用反斜杠控制字符的转换(参考下表)-E:关闭反斜杠控制字符的转换(缺省如此)-n :取消行末之换行符号(与-e 选项下的\c 字符同意)关於echo 命令所支持的反斜杠控制字符如下表:\a:ALERT / BELL (从系统喇叭送出铃声)\b:BACKSPACE ,也就是向左删除键\c:取消行末之换行符号\E:ESCAPE,跳脱键\f:FORMFEED,换页字符\n:NEWLINE,换行字符\r:RETURN,回车键\t:TAB,表格跳位键\v:VERTICAL TAB,纵向表格跳位键\n:ASCII 八进制编码(以x 开首为十六进制)\\:反斜杠本身(表格数据来自O'Reilly 出版社之Learning the Bash Shell, 2nd Ed.)或许,我们可以通过实例来了解echo 的选项及控制字符:例一:CODE:$ echo -e "a\tb\tc\nd\te\tf"a b cd e f上例运用\t 来区隔abc 还有def ,及用\n 将def 换至下一行。
例二:CODE:$ echo -e "\141\011\142\011\143\012\144\011\145\011\146"与例一的结果一样,只是使用ASCII 八进制编码。
例三:CODE:$ echo -e "\x61\x09\x62\x09\x63\x0a\x64\x09\x65\x09\x66"a b cd e f与例二差不多,只是这次换用ASCII 十六进制编码。
例四:CODE:$ echo -ne "a\tb\tc\nd\te\bf\a"a b cd f $因为 e 字母后面是删除键(\b),因此输出结果就没有 e 了。
在结束时听到一声铃向,那是\a 的杰作!由於同时使用了-n 选项,因此shell prompt 紧接在第二行之后。
若你不用-n 的话,那你在\a 后再加个\c ,也是同样的效果。
事实上,在日后的shell 操作及shell script 设计上,echo 命令是最常被使用的命令之一。
比方说,用echo 来检查变量值:CODE:$ A=B$ echo $AB$ echo $?(注:关於变量概念,我们留到下两章才跟大家说明。
)好了,更多的关於command line 的格式,以及echo 命令的选项,就请您自行多加练习、运用了...4) " "(双引号) 与' '(单引号)差在哪?还是回到我们的command line 来吧...经过前面两章的学习,应该很清楚当你在shell prompt 后面敲打键盘、直到按下Enter 的时候,你输入的文字就是command line 了,然后shell 才会以行程的方式执行你所交给它的命令。
但是,你又可知道:你在command line 输入的每一个文字,对shell 来说,是有类型之分的呢?简单而言(我不敢说这是精确的定义,注一),command line 的每一个charactor ,分为如下两种:* literal:也就是普通纯文本,对shell 来说没特殊功能。
Shell脚本编写中的常见问题与解决方法
Shell脚本编写中的常见问题与解决方法在Linux系统中,Shell脚本是一种非常常见的编程语言。
它可以通过简单的命令来实现许多复杂的任务。
然而,在Shell脚本编写过程中,我们常常遇到一些问题,如何解决这些问题呢?1. Shell脚本执行失败Shell脚本执行失败是一种非常常见的问题。
通常,它会出现一些错误提示信息,如“command not found”、“permission denied”等。
这些错误提示信息意味着命令无法正确执行。
解决这种问题的方法是检查Shell脚本中的命令是否正确、拥有足够的权限、以及相关的环境变量是否设置正确。
2. 调试Shell脚本当Shell脚本存在逻辑问题时,我们需要调试Shell脚本以找出问题所在。
在Shell脚本中,可以使用“echo”等命令输出调试信息。
这些调试信息可以帮助我们确定哪些命令执行失败,从而修复Shell脚本中的错误。
3. 调用Shell脚本中的变量在Shell脚本中,可以使用变量来存储数据,例如路径、文件名等。
当我们调用Shell脚本中的变量时,需要使用“$”符号来访问变量。
如果我们忘记使用“$”符号,Shell脚本将无法正确识别变量,并可能导致错误。
4. Shell脚本中的循环Shell脚本中的循环是一种非常常见的结构。
它可以用来遍历数组、执行一些操作等。
在Shell脚本中,可以使用“for”等关键字来实现循环。
当我们使用循环时,需要注意变量的作用域,以及循环的结束条件等。
5. Shell脚本中的权限问题在Linux系统中,每个文件和目录都有权限设置,我们需要在Shell脚本中使用“chmod”命令来设置Shell脚本的权限。
如果权限设置不正确,Shell脚本将无法正常执行。
我们需要使用“chmod”命令为Shell脚本添加必要的执行权限。
6. 在Shell脚本中执行命令Shell脚本通常涉及许多命令的执行,例如执行文件、查找文件、运行程序等。
shell常见问题
非常好的十道Linux shell脚本面试题1、编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下#/bin/sh#Programm :# Using for move currently directory to /tmpfor FileName in `ls -l | awk '$5>10240 {print $9}'`domv $FileName /tmpdonels -al /tmpecho "Done! "2、编写shell脚本获取本机的网络地址。
比如:本机的ip地址是:192.168.100.2/255.255.255.0,那么它的网络地址是192.168.100.1/255.255.255.0方法一:#!/bin/bash#This script print ip and networkfile="/etc/sysconfig/network-scripts/ifcfg-eth0"if [ -f $file ] ;thenIP=`grep "IPADDR" $file|awk -F"=" '{ print $2 }'`MASK=`grep "NETMASK" $file|awk -F"=" '{ print $2 }'`echo "$IP/$MASK"exit 1fi方法二:#!/bin/bash#This programm will printf ip/network#IP=`ifconfig eth0 |grep 'inet ' |sed 's/^.*addr://g'|sed 's/ Bcast.*$//g'` NETMASK=`ifconfig eth0 |grep 'inet '|sed 's/^.*Mask://g'`echo "$IP/$NETMASK"exit3、用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev 目录下。
Linux Shell编程复习 题集附答案
Linux Shell编程复习题集附答案Linux Shell编程复习题集附答案在本文中,我们将为您提供一份包含答案的Linux Shell编程复习题集。
通过这些题目的练习,您可以加深对Linux Shell编程的理解,并巩固所学知识。
一、基础知识题1. 什么是Shell?Shell是一种解释性的编程语言,用户可以通过Shell来与操作系统进行交互和控制。
答案:Shell是一种解释器,它接收用户的命令并将其转换为操作系统能够理解和执行的形式。
2. 常见的Linux Shell有哪些?答案:常见的Linux Shell有Bash、Zsh、Csh、Ksh等。
3. 如何查看当前使用的Shell是哪种类型?答案:可以使用echo $0命令查看当前使用的Shell类型。
4. 什么是环境变量?如何查看当前的环境变量?答案:环境变量是用来存储系统运行时的配置信息的变量。
可以使用echo $变量名命令查看当前环境变量的值。
5. 如何定义一个变量并给其赋值?答案:可以使用变量名=值的形式来定义并赋值一个变量。
二、基本命令题1. 如何查看当前所在的目录?答案:可以使用pwd命令来查看当前所在的目录。
2. 如何列出当前目录下的所有文件和文件夹?答案:可以使用ls命令来列出当前目录下的所有文件和文件夹。
3. 如何切换到某个目录?答案:可以使用cd命令加上目标目录的路径来切换到某个目录。
例如:cd /path/to/directory。
4. 如何创建一个新的文件夹?答案:可以使用mkdir命令加上目录名来创建一个新的文件夹。
例如:mkdir new_folder。
5. 如何复制一个文件?答案:可以使用cp命令加上源文件和目标文件的路径来复制一个文件。
例如:cp source_file target_file。
三、条件控制题1. 编写一个Shell脚本,判断一个文件是否存在,若存在则输出文件存在,若不存在则输出文件不存在。
shell十三问
己的环境。比如一个子shell可以改变它的工作目录,当它运行完后,其父shell的工作目录仍保持不变。
输入输出重定向
shell在执行程序前进行重定向。考虑下面两个例子,其中使用wc单词统计工具统计有五行的数据文件:
shell提供一个外设的保护层。当你启动一台基于UNIX的计算机时,UNIX的程序被调入计算机的内存里,直到你关机。这个程序叫做内
核(kernel),它执行许多底级和系统级的工作。内核有责任解释基本指令并将其送到处理器。内核也负责运行和调度进程,以及执行所
有的输入输出。内核是UNIX系统的心脏,内核有且只有一个。
shell都提供了相同的基本功能:
命令行解释功能
启动程序
输入输出重定向
管道连接
文件名置换
变量维护
环境控制
shell编程
命令行解释
当你登录进来,启动一个交互式的shell时,你会看到一个shell提示,通常是$,%或者#符号的形式。当你在提示符下敲进一行字符后,
(關於行程,我們日後有機會再補充。)
這裡,我們必須知道:kernel 與 shell 是不同的兩套軟體,而且都是可以被替換的:
* 不同的作業系統使用不同的 kernel ,
标准的一部分。它们是:
Bourne shell,由Stephen Bourne开发
Korn shell,由David Korn开发
C shell,由Bill Joy开发
shell的多样性使你可以选择最适合你或者你感到最亲近的界面。
SHELL十三问之十二:你要 if 还是 case 呢?
在bash shell中,我们可以如此修改上一段代码:
if comd1
then
comd2
comd3
else
comd4
comd5
fi
这也是我们在shell script中最常用到的if判断式:
当然,then或else后面,也可以再使用更进一层的条件判断式,这在shell script设计上很常见。
若有多项条件需要"依序"进行判断的话,那我们则可使用elif这样的keyword:
if comd1; then
comd2
elif comd3; then
comd4
else
comd5
fi
意思是说:
restart
;;
condrestart)
[ -f /var/lock/subsys/syslog ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart}"
exit 1
esac
(若你对positional parameter的印像已经模糊了,请重看第9章吧。)
fi
}
从例中,我们看得出来,最麻烦的部份是在于判断YN的值可能有好几种式样。
聪明的你或许会如此修改:
...
if echo "$YN" | grep -q '^[Yy]\([Ee][Ss]\)*$'
...
也就是用Regular Expression来简化代码。(我们有机会再来介绍RE)
shell面试题及答案
shell面试题及答案在准备面试时,对于Shell编程的问题是非常常见的。
Shell是一种命令行解释器,是Unix和Linux操作系统中的一种重要工具。
下面将为你介绍一些常见的Shell面试题及答案。
题目一:什么是Shell脚本?Shell脚本是一种用来编写Shell命令的脚本文件,它是由一系列的Shell命令组成的。
通过编写Shell脚本,可以将多个Shell命令按照一定的顺序组合执行,实现自动化的任务。
题目二:如何定义Shell脚本的执行方式?要定义Shell脚本的执行方式,可以在脚本文件的开头使用shebang (也称为hashbang)来指定解释器。
例如,使用#!/bin/bash来指定脚本由bash解释器执行。
题目三:如何查看Shell脚本的执行权限?可以使用ls命令来查看Shell脚本的执行权限。
执行权限分为三个级别,分别是用户(u)、群组(g)和其他(o)的权限。
ls命令的输出结果中,r表示可读,w表示可写,x表示可执行。
题目四:如何在Shell脚本中定义变量?在Shell脚本中,可以使用等号(=)来定义变量。
例如,使用name="Tom"来定义名为name的变量,并将其赋值为"Tom"。
题目五:如何在Shell脚本中读取用户输入?可以使用read命令来读取用户输入。
例如,使用read name来将用户输入赋值给名为name的变量。
题目六:如何在Shell脚本中进行条件判断?Shell脚本中的条件判断可以使用if语句来实现。
if语句的语法如下:if [ 条件 ]; then执行语句elif [ 条件 ]; then执行语句else执行语句fi其中,条件可以使用各种比较运算符(如-eq、-ne、-lt、-gt等)进行比较。
题目七:如何在Shell脚本中进行循环操作?Shell脚本中的循环操作可以使用for循环和while循环来实现。
for循环用于遍历一个列表或一个范围,while循环用于在条件满足时重复执行一段代码。
shell编程基础知识汇总
shell编程基础知识汇总Shell编程是一种在操作系统中通过命令行进行脚本编程的方式。
它是一种相对简单的编程语言,很容易学习和使用,并且在Unix和类Unix操作系统上广泛应用。
在本文中,我将为您汇总一些基础的Shell编程知识。
1. Shell脚本的基本结构:Shell脚本由一系列命令和控制结构组成。
它们被写在一个文本文件中,文件的第一行以“#!”开头,后面是解释器的路径。
脚本的主体部分包含了一系列的命令,可以通过换行符或分号将它们分隔开。
2. 变量:Shell脚本中可以定义和使用变量。
变量可以用来存储值,并在脚本中通过变量名进行引用。
在Shell中变量是大小写敏感的。
变量赋值可以直接使用“=”,但在使用变量时需要使用$符号。
例如:```name="John"echo "My name is $name"```3. 输入输出:Shell脚本可以通过读取标准输入和向标准输出打印信息来与用户进行交互。
标准输入通常通过键盘输入,标准输出通常在终端上显示。
例如:echo "Enter your name:"read nameecho "Hello, $name"```4. 命令行参数:Shell脚本可以从命令行接收参数,并在脚本中使用这些参数。
命令行参数可以通过特殊变量$1,$2等来引用,其中$1表示第一个参数,$2表示第二个参数,以此类推。
例如:```echo "Hello, $1"```运行脚本并传入参数:```./script.sh World```输出:```Hello, World5. 条件语句:Shell脚本可以使用条件语句来根据条件执行不同的命令。
条件语句的结构通常是使用if,elif和else关键字来定义多个分支,并使用then和fi关键字来表示分支的开始和结束。
例如:```if [ $1 -gt 10 ]; thenecho "Greater than 10"elif [ $1 -lt 10 ]; thenecho "Less than 10"elseecho "Equal to 10"fi```运行脚本并传入参数:```./script.sh 5```输出:Less than 10```6. 循环结构:Shell脚本可以使用循环结构来重复执行一系列命令。
shell 学习笔记(转)Unix系统 电脑资料
shell 学习笔记(转)Unix系统电脑资料
bbs.chinaunix./forum/viewtopic.php?t=218853showtype=new(+三问)假设我們需要在 mand line 中將這些保存字元的功能關閉的話,就需要 quoting 處理了,
假设我們需要在 mand line 中將這些保存字元的功能關閉的話,就需要 quoting 處理了,
在 bash 中,常用的 quoting 有如下三種方法:
* hard quote:' ' (單引號),凡在 hard quote 中的所有 meta. 均被關閉。
* soft quote: " " (雙引號),在 soft quoe 中大部份 meta. 都會被關閉,但某些則保存(如 $ )。
(註二)
* escape : \ (反斜線),只有緊接在 escape (跳脫字符)之後的單一 meta. 才被關閉。
( 註二:在 soft quote 中被豁免的具體 meta. 清單,我不完全知道,
有待大家補充,或透過實作來發現及理解。
)
原文转自:.ltesting.。
强人的SHELL面试
强人的SHELL面试强人的SHELL面试面试是人生中至关重要的一环,对于IT行业的从业者们更是如此。
在Linux系统下,SHELL(Shell是指壳,也就是命令行解释器)是常用的一种工具。
面试过程中,SHELL的基本操作和常用指令掌握情况是考官所关注的方面之一。
本篇文章将从面试官的角度出发,总结一些常见的SHELL面试问题和技巧,希望对准备面试的同学有所帮助。
1、在SHELL中,如何生成一个目录?在SHELL中,我们可以使用mkdir指令来生成一个目录,比如:$ mkdir testdir其中,testdir是要创建的目录名,可以根据需要更改。
2、如何查看当前所在目录?使用pwd指令可以查看当前命令行所在的目录,比如:$ pwd输出结果如下所示:/home/user此时可以看到,当前所在的目录为/home/user。
3、如何查看当前目录下的文件列表?使用ls指令可以查看当前目录下的文件列表,比如:$ ls输出结果如下所示:file1.txt file2.txt testdir此时可以看到,当前目录下有file1.txt文件、file2.txt文件和testdir目录。
4、如何创建一个空白的文件?在SHELL中,可以使用touch指令来创建一个空白的文件,比如:$ touch newfile.txt其中,newfile.txt就是要创建的文件名。
5、如何删除一个文件?使用rm指令可以删除一个文件,比如:$ rm file1.txt其中,file1.txt就是要删除的文件名。
需要特别注意的是,在执行删除文件操作时,一定要谨慎,以免误删数据。
6、如何删除一个目录?在SHELL中,使用rmdir指令可以删除一个目录,比如:$ rmdir testdir其中,testdir就是要删除的目录名。
7、如何复制一个文件?使用cp指令可以复制一个文件,比如:$ cp file1.txt file2.txt其中,file1.txt是要复制的原始文件名,file2.txt是复制后的文件名。
SHELL十三问之七:( ) 与 { } 差在哪?
所谓的function,就是用一个名字去命名一个command group,然后再调用这个名字去执行command group。从non-named command group来推断,大概你也可以猜到我要说的是{ }了吧?
在bash中,function的定义方式有两种:
方式一:
function function_name {
command1
command2
command3
....
}
方式二:
fuction_name () {
command1
command2
command3
....
}
用哪一种方式无所谓,只是若碰到所定义的名称与现有的命令或别名(Alias)冲突的话,方式二或许会失败。
但方式二起码可以少打function这一串英文字母,对懒人来说(如我),又何乐不为呢?... ^_^
是的,光从command line来看,( )与{ }的差别就讲完了,够轻松吧~~~ ^_^
然而,若这两个meta用在其它command meta或领域中(如Regular Expression),还是有很多差别的。只是,我不打算再去说明了,留给读者自己慢慢发掘好了...
我这里只想补充一个概念,就是function。
然而,在script中使用function却有许多好处,除了可以提高整体script的执行效能外(因为已被加载),还可以节省许多重复的代码...
简单而言,若你会将多个命令写成script以供调用的话,那,你可以将function看成是script中的script ... ^_^
