Shell 十三问 的学习记录

在 BBS上看到了Shell十三问的帖子,由于比较就远了,怕以后再也找不到了,就把笔记贴过来了,

原帖地址:

shell 十三问
http://bbs.chinaunix.net/thread-2033675-1-1.html

贴出我做的笔记:

<一>、为何叫做shell

使用者通过shell(操作系统即核心kernel的外壳)与kernel沟通,这是shell与kernel的命名的关系。

从技术角度讲,shell的最简单定义是——命令解译器( Command Interpreter )

/etc/shells 中存放着系统预装的好几种shell

大部分的linux 系统的预设 shell 都是 bash,原因:

*自由软件

*功能强大

<二>、shell prompt(PS1) 与 Carriage Return(CR)的关系?

$: 给一般使用者账号使用

#: 给 root(管理员)账号使用

shell prompt 的意思很简单:

是 shell 告诉使用者:您现在可以输入命令行了,使用者只有在得到 shell prompt 才能打开命令行,而 cursor(光标) 是指示键盘

在命令行所输入的位置,使用者每输入一个键,cursor 便往后移动一格,直到碰到命令行读进Carriage Return 字符为止。

Carriage Return 的意思也很简单:

是使用者告诉 shell:老兄你可以执行我的命令行了。

不同的命令可接受的命令行格式或有不同,一般情况下,一个标准的命令行格式为:

command-name options argument

若从技术细节来看,shell 会根据 IFS(Internal Field Seperator)将 command line 所输入的文字给拆解为“字段”

然后再针对特殊字符(meta)先作处理,最后在重组整行 command line. (注意:请务必理解上面两句话的意思,我们日后 的 学习中会经常回到这里思考。)

每一个命令行均必须含有命令名称,这是不能缺少的。

<三>、 别人 echo、你也 echo, 是问 echo 知多少?

承接上面所介绍的 command line, 这里我们用 echo 这个命令加以进一步说明,标准的 command line 饱含三个部件:command_name option argument

echo -e "a\t"       -e选项是打开反斜杠控制字符

<四>、 ""(双引号)与‘‘(单引号)差在哪?

hard quote: ‘‘ 单引号,凡在hard quote 中的所有系统保留关键字meta 均被关闭。

soft quote: "" 双引号,在soft quote中大部分的meta 都会被关闭,蛋某些则被保留(如 $)

escape: \ 反斜线,只有进阶在 escape(跳脱字符)之后的单一 meta才被关闭。

<五>、 var=value? export 前后差在哪?

所谓的环境变量就是那些会传递给子行程的变量

遗传性 是区分本地变量与环境变量的决定性指标

var=value 赋值只是给局部变量赋值

export var=value 则是给环境变量赋值

unset var   对var变量取消,与对其赋值为NULL 是不一样的

<六>、exec 跟 source 差在哪?

了解 父进程(parent process) 和子进程(child process)的区别,父进程产生子进程,子进程结束后将返回到父进程去,子进程继承父进程的环境变量。

命令脚本(shell script):就是将平时在 shell prompt 后所输入的多行 command line 依序写入一个文件中去而已。

其中再加上一些条件判断、互动界面、参数运用、函数调用、等等技巧,得以让 script 更加聪明的执行、。

结合上面两个概念(process + script),便不难理解下面这句话的意思了

正常来说,当我们执行一个 shell script 时,其实是先产生一个 sub-shell 的子进程,然后sub-shell 再去产生命令行的子进程。

一般我们跑的 shell script 是用 sub-shell去执行的。当用 subshell 来跑 script 的话吗sub shell 的workding dir($PWD) 会因为 cd 而变更,

但当返回 primary shell 时,$PWD 是不会变更的。

source

所谓 source 就是让script 在当前 shell 内执行、而不是产生一个 sub-shell来执行。

因此,只要我们将原本单独输入的script 命令行变成 source 命令的参数,就可以轻易解决上面提到的问题啦

./my.sh

可以变为

source ./my.sh  或 ../my.script

exec 也是让 script 在同一个进程上执行,但是原有进程则被结束了。这就是 exec 与 source/fork 的最大差异了

<七>、 ()与 {} 差在哪?

命令群组(command group):将多个命令集中处理。。

()将 command group 置于 sub-shell来执行,也称 nested sub-shell

{} 则是在同一个 shell 内完成,也称 non-named command group

function 就是用一个名字去命名一个command group,然后再调用这个名字去执行 command group.

<八>、 $(()) 与 $() 还有 ${} 差在哪?

$() 与 ``(反引号)都用来做命令替换用的。

所谓的命令替换与我们学过的变量替换差不多,都是用来重组命令行:完成引号里的命令行,然后将其结果替换出来,再重组命令行。

<九>、[email protected] 与 $* 差在哪?

[email protected] 与 $* 在一般时都可以获得函数的所有参数

但是,当 [email protected] 与 $* 处在 hard quote即 ""中时,表现出的区别是:

[email protected]  会将所有的参数挨个返回

$*  会将所有的参数拼成一个字符串返回

$#  可以返回参数的总数 (不包括 $0,即路径)

${10}  通过${}可以获得超过10的参数,否则会将$1拼接0返回

<10>、 && 与 || 差在哪?

A=123

[ "$A" = 100 ] 可以用来判断A 是否等于100

上面的格式会返回一个返回值,若返回值为 0则代表判断正确,返回值为 1代表判断错误

每个命令执行完之后均由一个返回值,跟上面的含义相同

[ "$A" = 100 ] && echo "yes,\$A is 100"    意思是 && 前面的返回值为 ture时 执行后面

[ "$A" = 100 ] || echo "no,\$A is not 100"  意思是 || 前面的返回值为 false时 执行后面

一行命令中可以有多个 &&  与 || 嵌套使用,如 [ "$A" = 100 ] || echo "no" && ls -G  && echo "yes"

<11>、 、、、、原帖子被丢了。。。。。

<11.1>、stdin 与 stdout

<11.2>、 stderr  及如何改变File Descriptor 的预设数据通道

<12>、 你要 if 还是 case 呢

if:

# if [[ "$A" = 123 ]]; then

#  echo "oh,Yes"

# elif [[ "$A" < 123 ]]; then

#  echo "oh , \$A > 123"

# else

#  echo "what"

# fi

case:

# case "$1" in

#  start )

#  echo "what is start";;

#  stop )

#  echo "hei,that is stop";;

#  ok )

#  echo "en , en A";;

# esac

<13>、 for what? while 与 until 差在哪?

....

时间: 2024-08-06 09:11:10

Shell 十三问 的学习记录的相关文章

android adb shell and monkey 学习记录

Monkey环境: android SDK and JDK SDK目录下的platform-tools和tools目录要配置环境变量 查看版本: ADB 的安装这里就不多说了,输入以下命令有如下提示就证明你环境ok,否则自行网上搜索解决下. > adb version 查看连接设备: 输入以下命令可以查询已连接的设备与模拟器: > adb devices 查看appPackage 和 appActivity: 设备运行程序 > adb logcat > \path\log.txt

『Shell编程』学习记录(2)

例1.文件io #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc, char **argv) { printf("%s\n",argv[1]); int fdt,fds; char buf[20]; int num = 0; if ((fds = open("/etc/profi

linux shell 快速入门小例子(shell十三问学习NOTE)

读CU论坛shell十三问后进行的几次小实验,备忘一下! SHELL十三问地址:http://bbs.chinaunix.net/thread-218853-1-1.html #!/bin/bash function func_com() { local a=1 local b="2c3" echo ${a}b echo $ab } function func_array() { echo "##### func_array #####" local PATH=&q

Python学习记录day6

Python学习记录day6 学习 python Python学习记录day6 1.反射 2.常用模块 2.1 sys 2.2 os 2.3 hashlib 2.3 re 1.反射 反射:利用字符串的形式去对象(默认)中操作(寻找)成员 cat commons.py #!/usr/bin/env python#_*_coding:utf-8_*_''' * Created on 2016/12/3 21:54. * @author: Chinge_Yang.''' def login(): pr

【学习记录】关于makefile而进行的互联网学习技巧练习及学习笔记和学习心得记录(vs2010)

我也不知道作为一个完全的windows平台下的不怎么专业的软件工程学生,看到<Accelerated C++>的源代码,第一反应是:哦!我应该用make生成工程文件.然后我愉快的用AOL开始搜索相关资料. 然并卵!我一定是被什么奇怪的生物附身了.我应该直接用vs创建项目->导入文件.然后……ctrl+F5.多么完美. 可是……以下: [教程]来自于云风大大的blog(云风的 BLOG) IDE 不是程序员的唯一选择(一) 以及后面的(二)(三)(四) 以及大大写了一篇半,只为了说明用cl

&lt;转&gt;shell经典,shell十三问

shell 十三问: 1) 为何叫做 shell ? 2) shell prompt(PS1) 与 Carriage Return(CR) 的关系? 3) 别人 echo.你也 echo ,是问 echo 知多少? 4) " "(双引号) 与 ' '(单引号)差在哪? 5) var=value?export 前后差在哪? 6) exec 跟 source 差在哪? 7) ( ) 与 { } 差在哪? 8) $(( )) 与 $( ) 还有${ } 差在哪? 9) [email prot

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

shell十三问(转)

这个我记得是在chinaunix论坛上最早出现的帖子. Shell 十三问 作者:www.chinaunix.net之網中人 1) 为何叫做 shell ? 在介绍 shell 是甚么东西之前,不妨让我们重新检视使用者与计算机系统的关系: 我们知道计算机的运作不能离开硬件,但使用者却无法直接对硬件作驱动, 硬件的驱动只能透过一个称为"操作系统(Operating System)"的软件来控管, 事实上,我们每天所谈的 linux ,严格来说只是一个操作系统,我们称之为"核心(

学习记录: 安装配置自动化工具ansible

学习记录:  安装配置ansible 更新日期: 2016-11-30 系统环境    :centos6.5 本机ip        :192.168.233.123 被管理机ip :192.168.233.124 ------------------------------------- py版本       :   默认python2.6 ansible版本:ansible 1.7.2 ansible参数:             -m  模块名(执行命令)              -a