Bash 基础

来源:互联网 发布:魔法王座神翼升阶数据 编辑:程序博客网 时间:2024/06/05 09:50

Bash介绍

Linux之父Linus对Bash的描述
我下载了一个叫Bourne Shell的外壳程序,它是UNIX初始外壳程序之一,可以从互联网上免费下载。名字来源自一个难听的双关语:
编写该外壳程序的家伙叫Steven Bourne(同borne 读音一样,但后者有出身、忍受之意)。而这个程序的名字叫“Bourne Again Shell”(再次忍受或出生之意),或一般叫“BASH”(有重击的意思)。

Sha-Bang
在脚本的开头”#!”,后面接着的是解释器的路径,如果路径不对的话,额……则会提示”bad interpreter”。”#!”占用了脚本开头的两个字节的魔法数字,它是文件类型的特殊标记。
在解释器进行对这个脚本进行解释的时候,由于它本身是由#开头,所以会以注视的形式跳过。

#!/bin/rm# Nothing happen, except that this file will disappear.echo "this line will never print"exit 0

上面的bash脚本将非常的有意思:
- sh test.sh echo 还是会执行的,能够打印出相应的内容。
- chmod u+x test.sh && ./test.sh 则如注释一般,什么也不做,除了test.sh文件本身消失一样。
同时需要注意’#!’只有在第一行才有作用,其余行都无效的,相当于普通的注释。

常用符号

  • . 通配任意字符;source 运算符,不会启动一个子shell来运行,环境会受到run.sh影响。如果直接运行./run.sh 则会启动一个子shell来运行,对于run.sh中的变量和函数,不会影响当前的shell。
  • * 表示0或多个前面的字符;乘法; ** 幂运算
  • ? 表示0或1个前面的字符
  • \ 转义字符
  • / 除法
  • | 位或运算
  • || 逻辑或运算
  • [ ] 属于内置命令(]居然不是), 与test一个意思; 数组元素
  • [ [ ] ] 属于关键字,test的扩展,继承自ksh88,在此结构中将没有 文件扩展和单词分离 ,但是会发生 参数扩展和命令替换 。比上面的更加灵活,更加的通用。
  • {} 代码块.又被称为内部组.事实上,这个结构创建了一个匿名的函数.但是与函数不同的,在其中声明的变量,对于脚本其他部分的代码来说还是可见的; 此外大括号还有扩展作用:cat {file1,file2}\ :\ {A,B,C} 中间不能有空格(有的话需要转义)。
  • () 命令组,将作为一个子shell执行
  • (()) 结构扩展 并进行算术运算,计算出0值退出码为1,非0值的退出码为0
  • & 位与
  • && 逻辑与
  • $ 变量替换;正则表达是表示结尾
  • $? 退出状态变量
  • ${} 参数替换
  • $# 参数个数:从0开始
  • $*所有的位置参数,被作为一个单词. 这里与IFS有关系
  • $@与$*同义,但是每个参数都是一个独立的”“引用字串,这就意味着参数被完整地传递,并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的。
  • $$ 进程pid
  • # 注释;参数替换;数制转换
  • ! 取反,注意后面有一个空格。 在命令行下可以启动Bash的历史机制n
  • ` ` 命令替换的一种,比$()更为通用。
  • , 命令依次顺序执行,将最后一个结果返回
  • <> & >> ascii码比较,管道
  • << & <<< Here Document & Here String
  • ” ” 弱引用,在”“中${}的变量还是会被替换的。
  • ’ ’ 强引用,在”中的变量是不会被替换的。
  • = 变量在赋值时,=前后都不能有空格,否则1)空格在=在前,会被当作一个命令,后接一个=的参数。2)空格在后,=前面一个作为环境变量,后面为作为命令来执行。
  • ; 命令分隔符
  • ;; 终止case选项
  • : 空命令,始终返回真(0或true)
  • ~($HOME) ~+($PWD) ~-($OLDPWD)
  • - 在需要一个文件名的地方,-重定向输出到 stdout(如在 tar 和 cf 命令中),或者从stdin 中接受输入,而不是从一个文件中接受输入.这是在管道中作为一个过滤器,来使用文件定位工具的一种办法.

变量和参数

  • 变量初始化
#!/bin/bashnum=123number=$numnumber= $num   #=后面有空白number =$num   #=前面有空白str="1 2   3   4   5"echo $str      #变量替换echo "$str"    #Quoting a variable preserves whitespace.echo '$str'    #变量不展开echo "$uninitialized"  #blank lineuninitialized += 5echo "$uninitialized"  #5

结果详情如下,解释请看注释

./test.sh:行6: 123: 未找到命令
./test.sh:行7: number: 未找到命令
1 2 3 4 5
1 2 3 4 5
$str

5

  • 特殊变量
    • local variables
      在代码块中才能见到
    • environmental variables
      每次当 shell 启动时,它都将创建自己的环境变量.更新或者添加新的环境变量,将导致 shell 更新它的环境,同时也会影响所有继承自这个环境的所有子进程
    • positional parameters
      位置参数:$0, $1, $2…10,{11}
      下面是关于位置参数以及shift的用法
#!/bin/bash#first argecho "first arg is $0"#last argecho "last arg is ${!#}"#shiftfor p in "$@"do    echo -n "$1 "    shiftdoneechoecho -n "after shifts: "#default valueecho ${1:-"\$1 is NULL"}

结果

[wingo-zhang@localhost Temp]$ ./test.sh 1 2 3 4 5
first arg is ./test.sh
last arg is 5
1 2 3 4 5
after shifts: $1 is NULL

这里主要记录以下,Linux Shell 基本的入门知识。如背景知识,常用的符号以及一些变量的用法。对于一些基本语句,就没怎么说明了。
常用的语句,如条件语句,循环语句等。

0 0
原创粉丝点击