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]中的元素, 并且将每个解析出来的部分都分配到一个位置参数中.

扫描二维码关注公众号,回复: 2324736 查看本文章
    #!/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

猜你喜欢

转载自blog.csdn.net/u012617944/article/details/73693028