您的位置:首页 > 运维架构 > Shell

Bash 基础

2015-06-11 22:18 323 查看

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/bash

num=123
number=$num
number= $num   #=后面有空白
number =$num   #=前面有空白

str="1 2   3   4   5"

echo $str      #变量替换
echo "$str"    #Quoting a variable preserves whitespace.
echo '$str'    #变量不展开

echo "$uninitialized"  #blank line
uninitialized += 5
echo "$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 arg
echo "first arg is $0"

#last arg
echo "last arg is ${!#}"

#shift
for p in "$@"
do
echo -n "$1 "
shift
done

echo
echo -n "after shifts: "
#default value
echo ${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 基本的入门知识。如背景知识,常用的符号以及一些变量的用法。对于一些基本语句,就没怎么说明了。

常用的语句,如条件语句,循环语句等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: