bash的使用

bash的工作特殊之命令执行状态返回值和命令展开所涉及的内容及其示例

什么是Bash 什么是Shell Bash 是 GNU Bourne-Again SHell,是目前大多数Linux发行版采用的Shell。

Shell 是 *nix提供给用户使用的界面。

一个操作系统的底层是独立运行的,用户界面和底层分开,可以最大限度的保证系统稳定。Shell就是一个特殊的程序,负责接受用户的命令,并把系统的响应返回给用户。

Bash Shell一般不需要自己安装,在安装发行版的同时都会安装好。

Shell的存在是和登陆相关的,从用户名密码验证通过以后,Shell就启动了,知道你退出,Shell就结束了运行。

除了Bash Shell之外,还有很多其他的Shell。

1、bash基本语法

下面看一个简单的shell文件(HelloWorld.sh):

#!/bin/bash

#This is an example

echo Hello World

(1)“#!”是说明这个文件类型的,Linux系统根据“#!”及其后面的字符串确定该文件的类型,/bin/bash表名该文件是一个bash程序,需要由/bin目录下的bash程序来解释执行。bash程序一般放在/Bin目录下,可以用命令“locate bash”,“whereis bash”,“find / -name bash >/dev/null”来找出bash安装位置。

(2)“#”是bash文件的注释,表示以#开头的一行是注释信息;echo是回显命令,将其后的内容输出到标准输出。Bash程序中绝大部分语句结束时没有分号。

(3)执行bash程序:sh HelloWorld.sh 或者./HelloWorld.sh(需要有可执行权限)

  1. bash变量

    bash中的变量是不能含有保留字,不能含有“-”等保留字符,也不能含有空格。

    在bash中,变量是不需要提前定义的,只要前面没有被定义过,就可以直接使用。一般使用变量的第一条语句是赋初值,若不赋初值,默认为NULL。

    例子:

    #!/bin/bash

    #This is an example

    STR="Hello World"

    echo $STR

    (1)变量赋值时,“=”号左右两边都不能有空格。

    (2)bash语句不需要分号(“;”)结尾。

    (3)除了变量赋值和在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

    在shell中对整数变量的运算有“+ - * / %”,一般通过let和expr这两个指令来实现(但从上面的例子可以看到,let进行的是整数运算,expr进行的是字符串替换)。

    (7)在比较操作上,整数变量和字符串变量不同:

    操作 整数 字符串

    相同 -eq =

    不同 -ne !=

    大于 -gt >

    小于 -lt <

    大于或等于 -ge

    小于或等于 -le

    为空 -z

    不为空 -n

    如:

    比较字符串变量a和b是否相等就写作:if [$a=$b]

    比较整数变量a和b是否相等写作:if [$a -eq $b]

    (8)除了整数和字符串之外,bash变量还可以作为文件变量操作。bash中没有浮点数运算。

    运算符

    含义( 满足下面要求时返回 TRUE )

    -e file 文件 file 已经存在

    -f file 文件 file 是普通文件

    -s file 文件 file 大小不为零

    -d file 文件 file 是一个目录

    -r file 文件 file 对当前用户可以读取

    -w file 文件 file 对当前用户可以写入

    -x file 文件 file 对当前用户可以执行

    -g file 文件 file 的 GID 标志被设置

    -u file 文件 file 的 UID 标志被设置

    -O file 文件 file 是属于当前用户的

    -G file 文件 file 的组 ID 和当前用户相同

    file1 -nt file2 文件 file1 比 file2 更新

    file1 -ot file2 文件 file1 比 file2 更老

    file,file1,和file2代表文件路径。

    3.局部变量

    在bash程序中,如果用了一个变量,该变量到程序的结尾一致有效。

    局部变量存在于一个局部程序块中,只要在赋初值时加上local关键字,就可以声明一个局部变量。

    例子:

    #!/bin/bash

    HELLO=Hello

    funtion hello{

    local HELLO=World

    echo $HELLO

    }

    echo $HELLO

    hello

    echo $HELLO

    该程序的执行结果是:

    Hello

    World

    Hello

    4.函数

    function my_funcname {

    code block

    }

    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

    result=$?

    echo $result

    exit 0

bash命令执行状态返回值

在bash中使用一个特殊的变量$?来保存上一个命令的执行状态结果。 (变量$的取值范围在0-255之间)

主要之含义:

0:正常结束

1:通用执行错误

2:误用shell命令

126:命令不可执行

127:命令未找到

128:无效退出参数

130:被ctrl-c强行中止

255:退出状态码越界

*在0-255范围内的所有值只有返回值为0是表示成功。

例:

exit $?

127

通过命令exit $?获取bash的返回值为127

bash命令展开

以某些bash能够解释的符号来代替命令中的某些参数。

~:展开为用户的家目录;

例:切换至家目录

cd ~;pwd

/root

{}:可承载一个以逗号分隔的列表,并将其展开为多个路径;

例:在/tmp/d目录下创建f1,f2,f3三个文件

touch /tmp/d/f{1,2,3}

bash

附:

bash特性之命令别名

获取当前用户可用的别名的定义:

这里写图片描述

bash的特性之命令历史

命令语法格式:

history [-c] [-d OFFSET] [n]

history -anrw [FILENAME]

history -ps VALUE [VALUE…]

-c: 清空命令历史;

-d offset(偏移量):删除指定命令历史,offset为history显示出来的命令数字

-r: 从文件读取命令历史至历史列表中;

-w:把历史列表中的命令追加至历史文件中;

history #:显示最近的#条命令;

bash特性之快捷键

Ctrl+a:跳转至命令行行首

Ctrl+e:跳转至命令行行尾

Ctrl+u:删除行首至光标所在处之间的所有字符;

Ctrl+k:删除光标所在处至行尾的所有字符;

Ctrl+l:清屏,相当于clear

bash的特性之命令补全和路径补全

1.命令查找和补全机制:

(1) 查找内部命令;

(2) 根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;

(3) 给定开头的部分字符串如果能惟一标识某命令程序文件,则直接补全;

不能惟一标识某命令程序文件,再击tab键一次,会给出列表;

2.路径补全

在给定起始路径下,以对应路径下的打头字串逐一匹配起始路径下每个文件:

TAB按键;

如果能惟一标识,则直接补全;

否则,再一次tab,给出列表;

3.命令行展开

~:自动展开为用户的家目录,或指定的用户的家目录;

{}:花括号展开。可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;

时间: 2024-10-05 22:32:13

bash的使用的相关文章

Linux Bash 提示符的一些骚操作

当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个 Bash 提示符:[[email protected]$host ~]$你知道命令行提示符其实是可以自己设置添加许多非常有用的信息的吗?在这篇文章中我就会教你如何自定义自己的 Bash 命令行提示符,想看的话就接着看吧~ 如何设置 Bash 提示符 Bash 提示符是通过环境变量 PS1 (提示符字符串 1Prompt String 1) 来设置的,它用于交互式 shell 提示符.当然如果你需要更多的输

Bash脚本之函数定义和调用

把那些在脚本中重复出现并且没有任何改变的代码,封装起来,在适当的场景中调用执行.程序员将这种被封装起来的代码称为功能体,或者叫模块,也称为函数.这样看来是不是和循环类似,循环也是为了方便去多次执行一堆代码,而函数是将一堆代码写在一起,起一个名字,然后在需要这堆代码的时候只需要写上函数的名字即可.在shell脚本编程中,函数是由若干条shell命令组成的语句块,函数里面的内容和shell程序形式上是一致的.不同之处就是,shell代码可以直接被执行,而函数中的内容,不能独立执行,只有被调用的时候才

Bash 的若干基本问题

Bash 的若干基本问题 这里介绍一些bash启动前.后的问题,以及一些使用bash需要注意的基本问题. 1.Bash的介绍 Bash是一种Shell程序,它是一般的Linux系统中的默认的Shell程序,一般情况下Bash指的是/bin/bash这个软件. 一个Linux系统中有多少个可用的Shell程序,可以从/etc/shells文件中查出来. 当前登录用户的默认Shell是哪一个,可以从/etc/passwd文件中与此用户对应的那一行最后一个字段看出来.或者也可以通过echo $SHEL

bash

bash编程 if 条件判断; then fi if 条件判断; then 内容 else 内容 fi

004-用户、组、权限管理命令及bash配置文件、管道、重定向、grep

l  1.用户管理命令 1.)创建用户命令 useradd  [OPTIONS] USERNAME -u(UID):指定用户UID -g(GID):指定基本组 -G( group,...):指定附加组 -c"COMMENT":指定注释信息 -d(home_dir):指定家目录/path/to/directory -s:指定SHELL路径(/etc/shells指定了当前系统可用的安全shell) -m –k:强行为用户创建家目录 -M:不创建用户家目录 /etc/login.defs

bash编程

变量:命名内存空间 变量类型:事先确定数据的存储格式和长度 字符 数值 1.整型 2.浮点型 日期时间 布尔型 算数运算 逻辑运算:与.或.非.异或 shell:弱类型编程语言 强:变量在使用前必须声明,甚至要初始化变量.数字型初始化为0,字符型初始化为空NULL 弱:变量用时声明,甚至不区分类型,默认是字符串. 变量赋值:VAR_NAME=VALUE bash变量类型 环境变量 本地变量(局部变量):与bash进程关联的变量 位置变量 特殊变量(系统变量):linux内置,用于保存特殊数据的变

bash 数组参数的传递

一.方式一 把数组参数当做普通变量传递 #!/bin/bash function arrayfun { echo "get function parameter $*" } arraypara=(claire obama george) arrayfun $arraypara 上面脚最终会显示 get function parameter claire 只收到了数组中的第1个参数 二.方式二 我们改动一下 #!/bin/bash function arrayfun { echo &qu

bash简单for循环2

写一个脚本:输入三个参数 0,1,2,3之一输入3:计算100以内所有能被3整除的正整数的和:输入2:计算100以内所有所有偶数的和:输入1:计算100以内所有所有奇数的和:输入0:计算100以内所有所有整数的和: 代码 #!/bin/bash # declare -i SUM=0 if [ $1 == 3 ];then   for I in {1..100};do     if [ $[$I%3] -eq 0 ];then       SUM=$[$SUM+$I]     fi   done

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(2)

三.命令历史bash从Korn Shell和C Shell中吸收了很多的精华,其中之一正式为已经执行过的命令保存一个缓存副本的特性,我们称之为"命令历史"功能.我们为什么要使用命令历史功能呢?每个用户登录成功之后,尤其是使用bash这样的文件接口登录之后,所有的操作都是由执行命令来实现的,那么就不可避免的会出现重复执行某个命令的情况,如果每个命令都依靠键入的方式来输入的话,固然没有问题,但是效率不高而且也是浪费时间的"可耻"行为,命令历史刚好给我们提供了解决这种问题

bash嵌套expect实现交换机的交互式登录实例

1. expect实现参数传递 1.1 实现 $argv 参数数组 expect脚本可以接受从bash传递过来的参数. 可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数 1.2 样例 cat telnet.exp #!/usr/bin/expect set host [lindex $argv 0] set passwd [lindex $argv 1] set passwden [lindex $argv 2] spawn telnet $h