bash shell 文件语法解读与总结

1. bash基本语法

下面看一个简单的shell文件(HelloWorld.sh):
        #!/bin/bash
        #This is an example
        echo Hello World
(1)“#!”是说明这个文件类型的,Linux系统根据“#!”及其后面的字符串确定该文件的类型,/bin/bash表名该文件是一个bash程序,需要由/bin目录下的bash程序来解释执行。
(2)“#”是bash文件的注释;echo是回显命令(标准输出;Bash程序中绝大部分语句结束时没有分号。
(3)执行bash程序:sh HelloWorld.sh 或者./HelloWorld.sh(需要有可执行权限)。

bash shell文件头文件常见有:
    1 #!/bin/sh
    2 #!/bin/bash
    3 #!/usr/bin/perl
    4 #!/usr/bin/tcl
    5 #!/bin/sed -f
    6 #!/usr/awk -f

详见:[http://blog.csdn.net/cjsycyl/article/details/7927727]

2. bash变量

注:bash中的变量是不能含有保留字,不能含有“-”等保留字符,也不能含有空格。
在bash中,变量是不需要提前定义的,一般使用变量的第一条语句是赋初值,若不赋初值,默认为NULL。
例子:
#!/bin/bash
#This is an example
STR=”Hello World”
echo $STR
(1)变量赋值时,“=”号左右两边都不能有空格
(2)除了变量赋值和在for语句循环头中,bash*变量*在使用时都需要加“$”。
(4)Bash程序是在一个新的进程中运行,该程序中的变量命名,赋值和使用不会影响其他进程或者原始shell变量已存在的值(相当于C++中的局部变量作用域?)
(5)以单引号括起来的变量将不再被解释为变量,如‘ STR {变量名}”,例子中是省略了{}的简化写法。
(6)bash变量没有类型的分别,一个变量可以被定义为字符串,也可以再被定为为整数,取决于变量的用途。

  例子(变量的运算):
    #!/bin/bash
    x=1999
    let "x=$x+1"
    echo $x    #输出2000
    x=`expr $x+1`
    echo $x    #输出2000+1
    x="Hello"$x 
    echo $x    #输出Hello2000+1

变量加减:(亲测实例)x=$(( $x + 1 ))注意首句路径格式等要写对;

(7)在比较操作上,整数变量和字符串变量不同:
这里写图片描述
如:
比较字符串变量a和b是否相等就写作:if [ a= b]
比较整数变量a和b是否相等写作:if [ aeq b]
(8)除了整数和字符串之外,bash变量还可以作为文件变量操作。bash中没有浮点数运算。
这里写图片描述
其中,file,file1,和file2代表文件路径

3.函数

    function my_funcname {
         code block
    }

(1)左边的写法“{” 之前要有空格,否则会有错误:syntax error near unexpected token `echo’
(2)函数的参数并不需要在定义时就指定,只需要通过bash保留变量 1, 2……来引用就可以了。
(3)函数的返回值可以用return语句来制定返回一个特定的整数,如果没有指定,则返回最后一条语句的执行结果(成功返回0,失败返回错误代码)。函数的返回值通过“$?”保留字来获得。BASH要求返回值必须为一个整数,不能有return语句返回字符串变量。
例子:square.sh

    #!/bin/bash
    square(){
    let "res=$1*$1"
    return $res
    }
    square $1 #$1表示第一个实参 5
    result=$?
    echo $result
    exit 0
    执行:sh funtest.sh 5   返回:25

4. 提取文件名和目录名

参考链接:(http://blog.csdn.net/ljianhui/article/details/43128465)
(1)使用 {}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的’/’或’.’。也就是说,上面的使用方法只是它使用的一个特例。

    #:表示从左边算起第一个
    %:表示从右边算起第一个
    ##:表示从左边算起最后一个
    %%:表示从右边算起最后一个
    换句话来说,#总是表示左边算起,%总是表示右边算起。

    *:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。

(2)basename和dirname

示例一
    [root@web ~]# basename /usr/bin/sort 
    sort
    [root@web ~]# dirname /usr/bin/sort 
    /usr/bin
    [root@web ~]#

5.for循环

格式:for arg in [list]
参考链接:http://blog.csdn.net/xinyuwuxian/article/details/8912204

#这是一个基本的循环结构. 它与C语言中的for循环结构有很大的不同.
    [html] view plain copy
    for arg in [list]  
    do   
        command(s)...   
    done  
    #在循环的每次执行中, arg将顺序的访问list中列出的变量.
    for arg in "$var1" "$var2" "$var3" ... "$varN"   

    # 在第1次循环中, arg = $var1   
    # 在第2次循环中, arg = $var2   
    # 在第3次循环中, arg = $var3   
    # 在第N此循环中, arg = $varN  
    # 在[list]中的参数加上双引号是为了阻止单词分割.

注:list中的参数允许包含通配符,如果do和for想在同一行中出现, 那么在它们之间需要添加一个分号.
for arg in [list] ; do

    #!/bin/bash  
    for planet in Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto  
    do  
        echo $planet  
    done  
    echo "---------------------------------------------------"  
    for planet in "Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto"  
    do  
        echo $planet  
    done  
    exit 0  

结果:

    root@ubuntu:~/resource/0510# ./test1   
    Mercury  
    Venus  
    Earth  
    Mars  
    Jupiter  
    Saturn  
    Uranus  
    Neptune  
    Pluto  
    ---------------------------------------------------  
    Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto  
    root@ubuntu:~/resource/0510#   

每个[list]中的元素都可能包含多个参数. 在处理参数组时, 使用set命令来强制解析每个[list]中的元素, 并且将每个解析出来的部分都分配到一个位置参数中.

    #!/bin/bash  
    for planet in "Mercury 36" "Venus 67" "Earth 93"  "Mars 142" "Jupiter 483"  
    do  
        set -- $planet  
        echo "$1        $2,000,000 miles from the sun"  
    done  
    exit 0  

结果:

    root@ubuntu:~/resource/0510# ./test1   
    Mercury     36,000,000 miles from the sun  
    Venus       67,000,000 miles from the sun  
    Earth       93,000,000 miles from the sun  
    Mars        142,000,000 miles from the sun  
    Jupiter     483,000,000 miles from the sun  
    root@ubuntu:~/resource/0510#   

6.cat命令使用

cat主要有三大功能:
1.一次显示整个文件。 catfilename2. cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件: $cat file1 file2 > file
参数:
-n 或 –number 由 1 开始对所有输出的行数编号
-b 或 –number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 –squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 –show-nonprinting

    例:
    #把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
    cat -n textfile1 > textfile2

    #把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
    cat -b textfile1 textfile2 >> textfile3
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Bash 是一种 Unix shell,它提供了一种命令语言和一个命令解释器。Bash 的源码可以帮助我们深入了解它的工作原理和实现细节。在这里,我将简要介绍一些 Bash Shell 的源码解读相关的内容。 1. Bash 的源码获取 Bash 的源码可以从 GNU 官网上下载,也可以从 Linux 发行版的软件源中获取。下载后解压缩,可以看到 Bash 的源码文件。 2. Bash 的编译与安装 在获取了 Bash 的源码后,需要进行编译和安装。在命令行进入 Bash 源码目录后,使用以下命令进行编译和安装: ``` ./configure make sudo make install ``` 3. Bash 的源码结构 Bash 的源码主要包括以下文件文件夹: - `configure`:用于生成 Makefile 的脚本。 - `Makefile.in`:用于生成 Makefile 的模板。 - `builtins`:内置命令的源码。 - `execute.c`:Bash 解释器的主要源码。 - `parse.y`:Bash 语法分析器的源码。 - `variables.c`:Bash 变量的源码。 - `lib`:Bash 库函数的源码。 4. Bash 的执行过程 Bash 的执行过程可以分为以下几个步骤: - 词法分析:将输入的命令字符串分解成单词。 - 语法分析:将单词序列转换为语法树。 - 执行命令:根据语法树执行相应的命令。 5. Bash语法分析器 Bash语法分析器使用了自上而下的递归下降分析方法,它通过 parse.y 文件中的语法规则将输入的单词序列转换为语法树。在语法分析阶段,Bash 还会进行一些重要的操作,如变量替换、命令替换和文件名扩展等。 6. Bash 的内置命令 Bash 的内置命令包括了一些常用的命令,如cd、echo、alias、export等。这些命令被编写为 C 函数,并包含在 builtins 目录下的相应源码文件中。 7. Bash 的变量 Bash 的变量包括了环境变量和本地变量。环境变量可以被所有子进程继承,而本地变量只能在当前 Shell 进程中使用。Bash 的变量在 variables.c 文件中定义和实现。 以上是 Bash Shell 源码解读的一些基本内容,希望对你有所帮助。如果你想深入了解 Bash 的实现和工作原理,可以查看 Bash 的源码文件并阅读相关的文档和资料。 ### 回答2: Bash Shell 是一种在 UNIX 和类 UNIX 系统中广泛使用的命令解释器,它允许用户以命令行的方式与操作系统进行交互。解读 Bash Shell 的源码有助于我们深入了解它的工作原理和内部机制。 Bash Shell 的源码主要由 C 语言编写,并且是开源的,这意味着任何人都可以查看和修改它。在源码中我们可以看到它的内部数据结构、函数调用和逻辑实现。 首先,Bash Shell 的源码包含了解释用户输入的部分,即将用户输入的命令解析成程序可以理解的格式。这一部分涉及到词法和语法分析,包括对命令的拆分、参数的解析、管道和重定向的处理等。这些解析的过程能够将命令拆分成合理的数据结构,并为后续的执行做准备。 其次,Bash Shell 的源码也包含了命令执行的逻辑。在这部分中,我们可以看到它是如何实现内置命令(如cd、echo等)和外部命令的执行。它通过调用系统函数和库函数来与操作系统进行交互,执行相应的命令和操作。 此外,源码中还包含了对变量和环境的处理。可以看到它如何定义和使用变量,以及如何读取和设置环境变量。对于环境的处理包括了对用户的主目录、当前工作目录等信息的维护。 通过解读 Bash Shell 的源码,我们可以更好地理解它是如何解释和执行用户的命令的。对于开发者来说,这样的解读可以帮助他们修复和改进 Shell 的功能和性能。对于用户来说,这样的解读可使他们更加深入地理解和使用 Bash Shell,并能够根据自己的需求进行定制和扩展。 总之,Bash Shell 源码解读是一项非常有价值的工作,它可以帮助我们更好地理解和使用 Bash Shell,并为改进和定制 Shell 提供参考。 ### 回答3: bash shell 是一个免费开源的命令行解释器,也是许多类Unix操作系统中最常用的shell之一。对于理解bash shell的工作原理和内部实现细节,直接阅读其源码是最直接的方式之一。 bash shell的源代码是用C语言编写的,位于bash源码包的`builtins`和`execute_cmds`等目录中。阅读源码时,可以从`main`函数开始,了解整个程序的执行流程。 在源码中,可以发现bash shell的核心组件包括解析器、执行器和内建命令。解析器负责解析用户输入的命令,将其转化为可执行的命令结构。执行器负责执行这些命令,并与操作系统交互。内建命令则是一些由shell内置的、不需要通过外部程序执行的命令。 在阅读源码时,可以关注以下几个方面: 1. 解析器:了解解析器是如何将用户的命令解析成可执行的命令结构的,以及如何处理重定向、管道等特性。 2. 执行器:了解执行器是如何执行命令的,包括如何创建子进程、进行进程间通信、进行信号处理等。 3. 内建命令:了解内建命令的实现细节,包括常见的命令如`cd`、`echo`等。 4. 变量和环境:了解shell是如何处理变量和环境,如何从环境变量中读取配置,如何设置和使用shell变量。 总结起来,阅读bash shell源码可以帮助我们深入了解该shell的工作原理、内部机制和核心组件的实现细节。通过仔细研究源码,可以更好地理解shell的运行方式和功能,也可以为我们编写更复杂的脚本和命令提供启发和指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值