• Linux shell编程基础


    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问 Linux 内核的服务。

    Shell 脚本(shell script),是一种为 shell 编写的脚本程序,一般文件后缀为 .sh。

    一、shell环境

    Linux 环境下有很多可以使用的shell,每个用户都拥有一个特定的默认shell。在Linux系统中,/etc/shells文件用于指定哪些程序路径可以作为有效的登录shell。

    Shell 的解释器种类众多,常见的有:

    shell 解释器说明
    shBourne Shell。sh 是 Unix 标准默认的 shell。
    bashBourne Again Shell。bash 是 Linux 标准默认的 shell。
    tcsh整合 C Shell ,提供更多的功能
    csh已经被 /bin/tcsh 所取代
    zsh功能强大的 shell 与脚本语言。

    要查看系统中允许的合法登录shell,可以执行以下命令:

    cat /etc/shells
    

    在这里插入图片描述

    1.1 当前用户的默认shell

    用户的“默认shell”是指他们登录系统后自动启动的命令行解释器或交互式shell。这个shell用于处理用户在命令行界面输入的命令和操作。
    可以使用如下命令查看当前默认shell

    echo $SHELL
    

    在这里插入图片描述

    1.2 修改当前用户默认shell

    要更改用户的默认shell,可以在命令行中输入以下命令:

    chsh -s <shell>
    

    其中是你想要设置为用户默认shell的路径。例如,要将当前用户的默认shell更改为Bash,可以执行:

    chsh -s /bin/bash
    

    系统会要求你输入当前用户的密码以确认此操作。确认后,用户的默认shell将被更改为Bash。但是似乎修改失败了。
    在这里插入图片描述

    1.3 指定脚本解释器

    shell脚本中,#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 解释器。#! 被称作shebang。
    #! 决定了脚本可以像一个独立的可执行文件一样执行,而不用在终端之前输入sh, bash, python, php等。

    指定 bash 解释器

    #!/bin/bash
    #!/usr/bin/env bash
    

    1.4 shell 脚本执行方法

    shell 脚本执行方法有多种,以如下helloworld.sh 为例

    #!/bin/bash
    echo "Hello, world!"
    

    可以使用下面的命令让 shell 以非交互模式运行:

    sh /path/to/script.sh
    bash /path/to/script.sh
    source /path/to/script.sh
    ./path/to/script.sh
    

    其中,source /path/to/script.sh 和 ./path/to/script.sh 是等价的。

    除此之外,你还可以通过chmod命令给文件添加可执行的权限,来直接执行脚本文件:

    chmod +x /path/to/script.sh #使脚本具有执行权限
    /path/to/test.sh
    

    二、注释

    注释可以说明你的代码是什么作用,以及为什么这样写。shell 语法中,注释是特殊的语句,会被 shell 解释器忽略。

    单行注释 - 以 # 开头,到行尾结束。
    多行注释 - 以 :<

    # echo '这是单行注释'
    
    ########## 这是分割线 ##########
    
    :<<EOF
    echo '这是多行注释'
    echo '这是多行注释'
    echo '这是多行注释'
    EOF
    

    三、shell 字符串输出

    3.1 echo

    echo用于字符串的输出。
    输出普通字符串

    echo "hello!"
    

    输出含有变量的字符串

    name=xiaoyuzhou
    echo "hello, \"${name}\""
    

    输出转义字符,需要使用-e参数。

    # 输出含换行符的字符串
    echo -e "first\nsecond"
    # \c 不换行
    echo -e "first \c"
    echo "second"
    

    3.2 printf 格式化输出字符串

    printf 不会像 echo 一样自动添加换行符,如果需要换行可以手动添加 \n。

    如下仿照ls -l 的输出格式,对文件夹信息进行打印输出
    在这里插入图片描述

    四、变量

    Bash 中没有数据类型,bash 中的变量可以保存一个数字、一个字符、一个字符串等等。同时无需提前声明变量,给变量赋值会直接创建变量。

    变量赋值时,等号左右不能有空格。访问变量的语法为:$var 或 ${var}。
    使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
    使用 unset 命令可以删除变量。变量被删除后不能再次使用。unset 命令不能删除只读变量。

    name="xiaoyuzhou"
    gender="male"
    echo ${name}
    readonly name
    # name="newname"  # 放开注释,执行报错
    unset gender
    

    五、环境变量

    环境变量是对当前 shell 会话内所有的程序或脚本都可见的变量。创建它们跟创建局部变量类似,但使用的是 export 关键字,shell 脚本也可以定义环境变量。

    常见的环境变量:

    变量描述
    $HOME当前用户的用户目录
    $PATH用分号分隔的目录列表,shell 会到这些目录中查找命令
    $PWD当前工作目录
    $RANDOM0 到 32767 之间的整数
    $UID数值类型,当前用户的用户 ID
    $PS1主要系统输入提示符
    $PS2次要系统输入提示符
  • 相关阅读:
    Linux-缓冲区(简单理解)
    单点登录以及实现(前后端分离和前后端不分离方式)
    自洽可分的哈密顿系统的辛算法
    第2周学习:卷积神经网络基础
    JDBC技术(java数据库连接技术)
    WPF-控件的常用属性-单例-隧道事件
    JAVA使用AffineTransform缩放字体
    含文档+PPT+源码等]精品基于springboot幼儿园管理系统包运行成功]Java毕业设计SpringBoot项目源码
    Codeforces Round #835 (Div. 4) D. Challenging Valleys
    C++学习笔记(Ⅳ):职工管理系统
  • 原文地址:https://blog.csdn.net/xiaoyuzhou1994/article/details/139543094