一、什么是shell
用户通过shell和kernel沟通。
同一个kernel,可以使用不同的shell:
二、shell prompt(PS1)与Carriage Return(CR)的关系
2.1 shell prompt与Carriage Return(CR)
shell prompt:
$:普通账号
#:root账号
coursor。
Carriage Return(CR) 由Enter键产生。
2.2 命令行(command line)
命令行: 就是shell prompt与Carriage Return(CR)之间输入的文件。
命令行格式:command-name options argument。
shell根据IFS(Internal Field Seperator)将command line输入的文字拆解为“字段”(word),然后再针对特殊字符(meta)先作处理,最后再重组整行command line。
IFS是shell预设使用的字段分隔符,可以由一个或多个一下按键组成:
空格键(White Space)
表格键(Tab)
回车键(Enter)
三、echo
echo -n
echo -e
echo -E(默认)
四、" "双引号 与 ' '单引号 差在哪
4.1 literal与meta
literal:普通纯文本,对shell来说没特殊功能。
meta:对shell来说,具有特殊功能的特殊保留字符。
4.2 quote
如果需要在command line中将这些保留字符的功能关闭的话,需要quoting处理。
hard quote:' '(单引号)所有meta都被关闭。
soft quote:" "(双引号)大部分meta被关闭,但某些则保留(如$)。
escape:\(反斜线),只有escape之后的单一meta被关闭。
五、var=value?export前后差在哪?
5.1 变量定义赋值
name=value
等号左右两边不能使用区分隔符号(IFS),也应避免使用shell的保留字符(meta charator)。
变量名称不能使用$符号。
变量名称第一个字母不能是数字(number)。
变量名称长度不可超过256个字符。
变量名称及变量值大小写是有区别的(case sensitive)。
5.2 export
shell中定义的变量,是“本地变量”(local variable)。
只有进过export命令的“输出”处理,才能成为“环境变量”(environment variable)。
5.3 unset
取消变量。
注意null value与unset的区别:
1. null value是变量的值为空;unset是取消变量,使变量不存在。
2. 二者输出,看起来一样。
六、exec跟source差在哪
6.1 fork
我们所执行的任何程序,都是父进程(pare。nt process)所产生出来的一个子进程(child process),子进程结束后,将返回到父进程中去。 这一现象在linux中成为fork。
子进程。
环境变量:会传递给子进程的变量。
6.2 shell script
将shell prompt后所输入的多行command line依次写入到一个文件中,其中再加上一些条件判断、互动界面、参数运用、函数调用等。
可以简单的看成,script只不过是依次执行预先写好的命令行而已。
理解cd /etc/path放在shell script中不执行。
6.3 source
就是让shell script在当前shell内执行,而不是产生一个sub-shell来执行。
6.4 exec
让shell script在同一个进程上执行,但原油进程被结束了。
6.5 fork / source / exec示例
1.sh:
#!/bin/bash A=B echo "PID for 1.sh before exec/source/fork:$$" export A echo "1.sh: \$A is $A" case $1 in exec) echo "using exec..." exec ./2.sh;; source) echo "using source..." source ./2.sh;; *) echo "using fork by default..." ./2.sh;; esac echo "PID for 1.sh after exec/source/fork:$$" echo "1.sh: \$A is $A"
2.sh:
#!/bin/bash echo "PID for 2.sh:$$" echo "2.sh get \$A=$A from 1.sh" A=C export A echo "2.sh: \$A is $A"执行结果:
七、()与{ }差在哪
7.1 ()与{ }区别
()将command group置于sub-shell中执行,也称nested sub-shell。
{ } 则是在同一个shell内完成,也称non-named command group。
7.2 函数定义
function function_name { command ... } function_name() { command ... }7.3 示例
3.sh:
#!/bin/bash output() { cd .. echo "2 $PWD" } echo "1 $PWD" case $1 in 1) output;; 2) (cd ..; echo "2 $PWD");; *) cd ..; echo "2 $PWD";; esac echo "3 $PWD"执行结果: