现在的位置: 首页 > 综合 > 正文

《shell十三问》上

2018年10月02日 ⁄ 综合 ⁄ 共 2422字 ⁄ 字号 评论关闭

一、什么是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"

       执行结果:

抱歉!评论已关闭.