当前位置: 首页 > 编程日记 > 正文

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.
<八>、 $(()) 与 $() 还有 ${} 差在哪?
$() 与 ``(反引号)都用来做命令替换用的。
所谓的命令替换与我们学过的变量替换差不多,都是用来重组命令行:完成引号里的命令行,然后将其结果替换出来,再重组命令行。
<九>、$@ 与 $* 差在哪?
$@ 与 $* 在一般时都可以获得函数的所有参数
但是,当 $@ 与 $* 处在 hard quote即 ""中时,表现出的区别是:
$@  会将所有的参数挨个返回
$*  会将所有的参数拼成一个字符串返回
$#  可以返回参数的总数 (不包括 $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 差在哪?
....

转载于:https://www.cnblogs.com/cg-Yun/p/4139509.html

相关文章:

图解八大排序算法——我见过的最详细的讲解(转)

一、分类 1.内部排序和外部排序  内部排序&#xff1a;待排序记录存放在计算机随机存储器中&#xff08;说简单点&#xff0c;就是内存&#xff09;进行的排序过程。外部排序&#xff1a;待排序记录的数量很大&#xff0c;以致于内存不能一次容纳全部记录&#xff0c;所以在排…

UE4创建第一人称射击游戏学习教程 Unreal Engine 4: Create Your Own First-Person Shooter

UE4创建第一人称射击游戏学习教程本课程包含38节视频课&#xff0c;将逐步指导您完成以下主题: 云桥网络 平台获取课程&#xff01; 如何创建6种可定制的武器(包括手枪、突击步枪、猎枪、狙击枪、榴弹发射器和火箭发射器) 如何制作基于命中扫描和投射的武器 如何制作第一人…

PS多形式的部分之间复制“笨办法”

PS剪切页面&#xff0c;有时候你可能会遇到这样的情况&#xff1a;设计改进&#xff0c;但是&#xff0c;我们要具有相同的切片。 在此假设&#xff0c;可以直接用于切割片。我们可以节省大量的时间&#xff0c;又分为片。 但是&#xff0c;人们一般不会在你的上跨片设计PSD在变…

Java学习总结:30

线程的生命周期 suspend()方法&#xff1a;暂时挂起线程&#xff1b; resume()方法&#xff1a;恢复挂起的线程&#xff1b; stop()方法&#xff1a;停止线程。 对于以上三个方法不推荐使用&#xff0c;它们已经被慢慢废除掉了&#xff0c;主要原因是这三个方法在使用时容易产…

SVN优化(一) SVN忽略maven项目的target

SVN优化(一) SVN忽略maven项目的target 一 eclipse刚开始导入的项目: 二 解决办法 方式一&#xff1a; 在项目代码路径,如: F:\xyx\sl 鼠标右键,“TortoiseSVN”-- >“Settings” -->"Subversion"-->"Global ignore pattern" 添加:target *.…

“WPF老矣,尚能饭否”—且说说WPF今生未来(上):担心

2019独角兽企业重金招聘Python工程师标准>>> 近日微软公布了最新的WPF路线图&#xff0c;一片热议&#xff1b;对于老牌控件提供商葡萄城来说&#xff0c;这是WPF系列控件一个重要的机遇&#xff0c;因此&#xff0c;Spread Studio for WPF产品做了一次重要更新&…

C语言新手写扫雷攻略3

界面绘制好后&#xff0c;雷数也布置了&#xff0c;接下来就是游戏的运行过程了&#xff0c;今天先不说具体过程&#xff0c;再来看看需要用到的辅助函数 先是简单的画红旗&#xff0c;鼠标右键的功能是画红旗&#xff0c;至此我们都是在使用函数自己绘图&#xff0c;效率是低&…

制作欧比旺·克诺比逼真的CG角色学习教程

艺术站-制作欧比旺克诺比逼真的Cg角色 大小解压后&#xff1a;4.98G 含课程素材文件 1920X1080 .mp4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 课程获取&#xff1a;制作欧比旺克诺比逼真的CG角色学习教程 信息: 欧比旺是我一直以来…

Java学习总结:31(StringBuffer类)

StringBuffer类 在Java中String类不适合使用于频繁修改字符串的操作上(因为其字符串常量一旦声明则不可改变&#xff0c;只能改变字符串对象&#xff0c;改变的是其内存地址的指向)&#xff0c;所以我们可以使用StringBuffer类方便用户进行内容的修改。 例&#xff1a;观察Str…

c语言常用数据类型转换整理

你要发送原始数据流 还是 格式化输出&#xff1f; 如果是格式化 按原子说的 &#xff0c;用sprintf / printf; 如果发送原始内存数据流&#xff0c; 可按下面发送&#xff0c; 发送 #define BYTE0(pointer) (*((char*)(&pointer)0)); #define BYTE1(pointer) (*((char…

2022-2028年中国老年旅游市场深度调研及开发战略研究报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国老年旅游行业市场行业相关概述、中国老年旅游行业市场行业运行环境、分析了中国老年旅游行…

Andriod使用webview控件往APP里内嵌网页

1.布局文件片段&#xff1a;res-layout <WebView android:id"id/Toweb" android:layout_width"fill_parent" android:layout_height"fill_parent" /> 2.Java片段&#xff1a;src Overrideprotected void onCreate(Bundle savedInstance…

垃圾回收器ZGC应用分析总结

ZGC 是一款低延迟、高吞吐的垃圾回收器,由 Oracle 公司开发。它适用于大型、多核、内存容量较大的应用程序。ZGC 的设计目标是在最大限度地减少停顿时间的同时,为大型内存提供可伸缩性,并为生产部署提供高吞吐量和稳定性。它的目标是以不到 10 毫秒的暂停时间来控制 100MB 到 4TB 的内存。此外,ZGC 还致力于避免全局 JVM 暂停,从而提高系统的可用性。简单来说,它的设计目标是在不超过 10 毫秒的暂停时间内,尽可能地回收大量的堆内存。低延迟:ZGC 的主要目标是最小化 GC 暂停时间。

14个Java并发容器,你用过几个?

不考虑多线程并发的情况下,容器类一般使用ArrayList、HashMap等线程不安全的类,效率更高。在并发场景下,常会用到ConcurrentHashMap、ArrayBlockingQueue等线程安全的容器类,虽然牺牲了一些效率,但却得到了安全。上面提到的线程安全容器都在java.util.concurrent包下,这个包下并发容器不少,今天全部翻出来鼓捣一下。仅做简单介绍,后续再分别深入探索。ConcurrentHashMap:并发版HashMap。

MySQL主从复制(基于binlog日志方式)

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。主从复制的作用1.做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。2.架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。3.读写分离,使数据库能支撑更大的并发。a.从服务器可以执行查询工作(就是我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)

RabbitMQ安装

windows上安装过程&#xff1a;https://blog.csdn.net/linsongbin1/article/details/80170567运行中给新建用户赋权限&#xff0c;如果界面创完用户忘给权限了可以用这个方法&#xff1a;https://blog.csdn.net/hello_world_php/article/details/83859767 备注&#xff1a;我的…

Complete C# Unity Game Developer 2D

你会学到什么 从头开始学习C#&#xff0c;一门强大的现代语言。没有编程经验是必要的。 在使用Unity游戏引擎方面变得优秀。 为游戏设计和游戏开发打下坚实的基础&#xff0c;这将有助于您构建自己的游戏。 了解面向对象编程在实践中如何工作。 创建可玩的游戏项目——对你的投…

玩转android自定义控件二——自定义索引栏listview

带索引栏的listview&#xff0c;在android开发非常普遍&#xff0c;方便用户进行字母索引&#xff0c;就像微信通讯录这样&#xff1a; 今天&#xff0c;我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了&#xff0c;我们应当梳理出一个思路。 ①首先应当将字母…

172. 阶乘后的零

给定一个整数 n&#xff0c;返回 n! 结果尾数中零的数量。 示例 1: 输入: 3 输出: 0 解释: 3! 6, 尾数中没有零。示例 2: 输入: 5 输出: 1 解释: 5! 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为 O(log n) 。 话不多说&#xff0c;先上代码&#xff1a; class So…

Mysql函数group_concat、find_in_set 多值分隔字符字段进行数据库字段值翻译

Mysql函数group_concat、find_in_set进行数据库字段值翻译 场景 配方表&#xff1a;记录包含的原料 sources表示原料&#xff0c;字段值之间用逗号分隔 原料表&#xff1a;对应原料id和原料名称 现需要查询出的原料结果显示为原料名称&#xff0c;并以逗号分隔。可通过函数g…

网站速度优化-前端篇

2019独角兽企业重金招聘Python工程师标准>>> 页面中最好不要有js片段&#xff0c;合并多个js为一个js&#xff0c;并将js压缩 &#xff08;百度搜索&#xff0c;有在线js压缩、解压缩工具&#xff09;&#xff0c;并放在文档底部页面中最好不要有css片段&#xff0c…

HashMap总结

为什么用HashMap HashMap是一个Hash桶(数组链表)&#xff0c;桶存储的内容是键值对(Key-value)映射HashMap采用了数组和链表的数据结构&#xff0c;能在查询和修改方便继承了数组的线性查找和链表的寻址修改HashMap是非synchronized&#xff0c;所以HashMap很快(哈哈哈)与HashT…

Blender与Substance painter制作三维手枪

你会学到: Blender和Substance painter的基础知识 建模 纹理制作 烘焙 Uv展开 Boolens和斜角修改器 如何制作游戏准备枪 课程获取&#xff1a;Blender与Substance painter制作三维手枪 – 云桥网络-CG技术学习平台 要求 Blender Substance painter 你好&#xff0c;我是3d艺术…

Java学习总结:32(Runtime类)

Runtime类 该类用于表示虚拟机(JVM)运行时的状态&#xff0c;每次启动JVM都对应一个Runtime实例&#xff0c;且只有一个实例&#xff0c;利用Runtime类可以启动新的进程或进行相关运行时环境的操作。此外&#xff0c;该类采用单例模式设计&#xff0c;对象不可以直接实例化。所…

转:查看系统是64位还是32位

1、getconf LONG_BIT or getconf WORD_BIT 例如&#xff1a; 2、file /bin/ls 例如&#xff1a; 查看linux的版本: 转载于:https://www.cnblogs.com/lei-lei/p/5029120.html

Redis问题——Error: 磁盘在使用中,或被另一个进程锁定。

Redis出于对数据保护&#xff0c;默认只能本地客户端连接。远程连接就会出现以上错误。如何解决这一问题&#xff0c;看下&#xff1a; server -A&#xff0c;PC-A&#xff0c; 修改server-A的redis.conf:注释掉本地绑定&#xff1b; bind 127.0.0.1 表示指定绑定本机IP&…

[转]C#索引器

索引器是一种特殊的类成员&#xff0c;它能够让对象以类似数组的方式来存取&#xff0c;使程序看起来更为直观&#xff0c;更容易编写。 1、索引器的定义 C#中的类成员可以是任意类型&#xff0c;包括数组和集合。当一个类包含了数组和集合成员时&#xff0c;索引器将大大简化对…

从Java8到Java21各版本新特性详解

​ 下面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线,可以看出,JDK 17的支持时间最长,可以延续到2029年9月。考虑到技术更新的速度,这次免费商用8年的时间可谓是经过精心考虑,旨在让用户放心地升级到JDK 17(不过JDK 8的支持时间更长,到2030年12月)。​ 从JDK诞生到现在,仅有几个版本得到了长期支持,主要包括JDK 7、JDK 8、JDK 11以及即将发布的JDK 17,它将是继Java 8之后最重要的LTS版本,是Java社区八年努力的成果。

make[1]: g++: Command not found

今天装了nmap软件&#xff0c;开始报这种错&#xff1a;g -c -Iliblua -Ilibdnet-stripped/include -Ilibpcre -Ilibpcap -Inbase -Insock/include -fno-strict-aliasing -DHAVE_CONFIG_H -DNMAP_NAME\"Nmap\" -DNMAP_URL\"http://nmap.org\" -DNMAP_PL…

学习如何用平板电脑设计和绘制自己的动漫角色

创造你自己的动漫人物插图 学习如何用平板电脑设计和绘制自己的动漫角色 大家好&#xff0c;我是Pesa&#xff0c;一个想把快乐和希望融入到讲述故事的插画中的插画师。一点一点地&#xff0c;我画出我喜欢和希望的事物的场景&#xff0c;它把我带到了101班。 艺术世界 艺术是…