写点什么

shell 学习

发布于: 2021 年 03 月 28 日

Shell 是什么?

shell 本身是一个命令解释器,介于操作系统的内核(kernel)态和用户态之间,可以执行系统调用及系统命令等,让用户以此来与操作系统实现互动。同时,它也用来指一种计算机程序语言(类似于 C、Python 等)。一个 shell 程序一般被称为一个脚本。

Shell 语言的流派

目前,shell 主要有两大流派:

  • sh:burne shell (sh)burne again shell (bash)

  • csh:c shell (csh)tc shell (tcsh)korn shell (ksh)

目前,大部分 Linux 系统预设的 shell 都是 bash。

Ubuntu16.04 提供的 shell 环境(登录成功后默认使用 bash):

slot@slot-ubt:~$ cat /etc/shells # /etc/shells: valid login shells/bin/sh/bin/dash/bin/bash/bin/rbashslot@slot-ubt:~$ 
复制代码

Mac OS 提供的 shell 环境:

$ cat /etc/shells# List of acceptable shells for chpass(1).# Ftpd will not allow users to connect who are not using# one of these shells.>/bin/bash/bin/csh/bin/ksh/bin/sh/bin/tcsh/bin/zsh  # zsh系本文作者自己安装 
复制代码

一个极简的 bash demo: hello_world.sh

    #!/bin/bash        # Here is comment     echo "Hello World!"
复制代码

执行

方法 1: 直接使用 bash 解释器来解释执行:


    bash hello_world.sh
复制代码

或者:

    sh hello_world.sh
复制代码

方法 2: 先将文件属性改为可执行状态:

    chmod +x hello_world.sh
复制代码

或者:

    chmod 777 hello_world.sh  
复制代码

再直接执行:

    ./hello_world.sh
复制代码

输出

    Hello World!
复制代码

解释

    #!用来指定执行该脚本的解释器,后面的/bin/bash表明指定/bin目录下的bash程序来解释执行该脚本文件。
复制代码


    #开头的是注释行(#!除外),shell中只有单行注释。  
复制代码


    echo "Hello World!" 即用echo命令输出字符串"Hello World!"到终端显示器。
复制代码

补充知识: 文件的属性

通过ls -l命令可以查看文件的属性,例如查看新建文件 test.sh 的属性:


slot@slot-ubt:~$ touch test.shslot@slot-ubt:~$ ls -l test.sh -rw-rw-r-- 1 slot slot 0 12月 21 15:40 test.sh
复制代码

可以看到,一般新建文件的默认属性是-rw-rw-r--,即 644,不具有可执行属性x,可使用chmod命令来改变文件属性(修改默认属性则使用umask命令),例如将文件 test.sh 的属性改为可读可写可执行(rwx: 4 + 2 + 1 = 7):

slot@slot-ubt:~$ chmod 777 test.sh slot@slot-ubt:~$ ls -l test.sh -rwxrwxrwx 1 slot slot 0 12月 21 15:40 test.sh
复制代码

Bash 中的变量

变量的定义与赋值

不像 C、Java 等静态语言需要先声明然后才能使用,而是和 Python 等动态语言类似,Bash 变量在使用时直接定义,例如:

my_bash_var="this is my bash var"
复制代码

注意:

  • 两边不能有空格!否则就是语法错误了。

  • Bash 变量命名只能使用字母,下划线和数字,并且不能以数字开头。

变量的引用

使用已定义的变量时,只要在变量名前面加$符号即可:

echo $my_bash_var
复制代码

或者使用${var_name}的形式,{}是可选的,主要是帮助解释器更好地识别变量的边界(推荐):

echo ${my_bash_var}
复制代码

注意''""的区别:

  • '' :单引号里的任何字符都会原样输出,单引号中对变量引用是无效的,且单引号中不能出现单引号(对单引号使用转义符也不行);

  • "":双引号里可以引用变量,可以出现转义字符。

实例:

a="hello"echo 'a is : $a'echo "a is : $a"
复制代码

Output:

a is : $aa is : hello
复制代码

只读变量

使用 readonly 命令可以将变量限定为只读变量,这与 C 语言中的 const 常量类型的情况相同.

a_var="hello"readonly a_vara_var="world"  # Output: bash: read-only variable: a_var
复制代码

删除变量

使用 unset 命令可以删除变量,但是不能删除只读变量。

变量被删除后不能再次使用。


用户头像

公众号【我是程序员小贱】干货分享 2019.10.15 加入

计算机小硕,热爱分享

评论

发布
暂无评论
shell学习