热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

认识Bash(一):变量的理解

背景操作系统简史贝尔实验室Unix(AT&TUnixVSBSDSUN)PC时代(比尔盖斯DOSVS乔布斯Apple)CUI时代(比尔盖斯WindowsVS乔布斯MacOSVSLin




背景


操作系统简史

  • 贝尔实验室Unix(AT&T Unix VS BSD SUN)

  • PC时代(比尔盖斯DOS VS 乔布斯 Apple)

  • CUI时代(比尔盖斯Windows VS 乔布斯 Mac OS VS Linux)

  • 移动时代(Google Android VS 乔布斯 IOS)


shell的价值

  • 人机交互:shell VS GUI

  • 批处理:


    • Linux、unix、Mac、Android、IOS
    • 脚本自动化 VS GUI 自动化
  • 工作场景


    • 服务端测试
    • 移动端测试
    • 持续集成与自动化部署

shell种类

  • 常用shell


    • bash
    • sh
    • zsh
  • Windows需要安装cygwin


    • Cygwin
    • git bash

Windows上没有/etc/shells


bash语言


变量


变量的定义

a=1
b=ascsd
c="hell world"
e='hell from "沐川"'

= 左右不要有空格

如果内容有空格,需要使用单引号或者双引号

双引号支持转译 $开头的变量会被自动替换


变量使用

echo $a
echo ${b}
echo "$a"

使用$var 或





v


a


r






访




































{var}来访问变量。后者更为严谨。


var来访问变量。后者更为严谨。var_x${var}_x是不同的

变量不需要定义也可以使用。引用未定义的变量,默认为空值


系统预定义变量

输入echo $ 敲两次tab键,系统会自动补齐与定义变量,例如:

[a1111@1111deMacBook-Pro ~ % echo $
! TERM_PROGRAM_VERSION
# TERM_SESSION_ID
$ TIMEFMT
* TMPDIR
- TMPPREFIX
0 TRY_BLOCK_ERROR
? TRY_BLOCK_INTERRUPT
@ TTY
ARGC TTYIDLE
CDPATH UID
COLUMNS USER
CPUTYPE USERNAME
EGID VENDOR
EUID WATCH
FIGNORE WATCHFMT
FPATH WORDCHARS
FUNCNEST XPC_FLAGS
GID XPC_SERVICE_NAME
HISTCHARS ZSH_ARGZERO
HISTCMD ZSH_EVAL_CONTEXT
HISTFILE ZSH_NAME
HISTSIZE ZSH_PATCHLEVEL
HOME ZSH_SUBSHELL
HOMEBREW_BOTTLE_DOMAIN ZSH_VERSION
HOMEBREW_CELLAR _
HOMEBREW_PREFIX __CFBundleIdentifier
HOMEBREW_REPOSITORY aliases
HOMEBREW_SHELLENV_PREFIX argv
HOST builtins
IFS cdpath
INFOPATH commands
KEYBOARD_HACK dirstack
KEYTIMEOUT dis_aliases
LANG dis_builtins
LINENO dis_functions
LINES dis_functions_source
LISTMAX dis_galiases
LOGCHECK dis_patchars
LOGNAME dis_reswords
LaunchInstanceID dis_saliases
MACHTYPE fignore
MAILCHECK fpath
MAILPATH funcfiletrace
MANPATH funcsourcetrace
MATCH funcstack
MBEGIN functions
MEND functions_source
MODULE_PATH functrace
NULLCMD galiases
OLDPWD histchars
OPTARG history
OPTIND historywords
OSTYPE jobdirs
PATH jobstates
PPID jobtexts
PROMPT key
PROMPT2 keymaps
PROMPT3 mailpath
PROMPT4 manpath
PS1 module_path
PS2 modules
PS3 nameddirs
PS4 options
PSVAR parameters
PWD patchars
RANDOM path
READNULLCMD pipestatus
SAVEHIST precmd_functions
SECONDS prompt
SECURITYSESSIONID psvar
SHELL reswords
SHELL_SESSION_DID_HISTORY_CHECK saliases
SHELL_SESSION_DID_INIT signals
SHELL_SESSION_DIR status
SHELL_SESSION_FILE termcap
SHELL_SESSION_HISTFILE terminfo
SHELL_SESSION_HISTFILE_NEW userdirs
SHELL_SESSION_HISTFILE_SHARED usergroups
SHELL_SESSION_HISTORY watch
SHELL_SESSION_TIMESTAMP_FILE widgets
SHLVL zle_bracketed_paste
SPROMPT zsh_eval_context
SSH_AUTH_SOCK zsh_scheduled_events
TERM zshexit_functions
TERM_PROGRAM

数组变量

array=(1 2 3 4 5)
array=('ls')
echo ${array[2]} # 取数组名为array中下角标为2的值
echo ${array[*]} # 取数组名为array中所有值
echo ${#array[*]} # 打印数组长度

使用()来定义数组变量,中间使用空格隔开


特殊符号的使用

  • 双引号用于括起一段字符串,支持$var形式的变量转换

a1111@1111deMacBook-Pro ~ % a=MuChuan
a1111@1111deMacBook-Pro ~ % echo "hoell world ${a}"
hoell world MuChuan

  • 单引号也表示其内容是字符串值,不支持转义

a1111@1111deMacBook-Pro ~ % echo 'hoell world ${a}'
hoell world ${a}

  • \ 反斜线,某些情况下表示转义

a1111@1111deMacBook-Pro ~ % echo -e "hoell world \n ${a}"
hoell world
MuChuan

  • $(ls) 表示执行ls后的结果。与``类似。不过可以嵌套

  • `反引号。用法比较独特,代表命令的输出。非常有用






  • (


    (


    )


    )







































    (())对变量进行操作,例如相加


    (())对变量进行操作,例如相加((a+b))$((2+3))

a1111@1111deMacBook-Pro ~ % a=1
a1111@1111deMacBook-Pro ~ % b=2
a1111@1111deMacBook-Pro ~ % echo $((a+b))
3

  • (())是整数扩展。把里面对变量当作整数去处理

  • ({1…10})等价于seq1 10。表示1到10


变量类型

字符串:a="asda"

数字:b=1

布尔型:c=ture d=false


数字型变量操作

计算:i=1;echo $i;echo $((i+1))

更新:((i=i+1));echo $i

只能进行整数计算

浮点型计算需要使用awk 'BEGIN{print 1/3}'


字符串操作

  • 取值


    • ${value:offset} ${value:offset:length}从变量中提取子串

      a1111@1111deMacBook-Pro ~ % echo ${a:0:5}
      holl
      a1111@1111deMacBook-Pro ~ % echo ${a:1:5}
      oll w

    • ${#value} 字符串的长度

      a1111@1111deMacBook-Pro ~ % echo ${#a}
      18

    • ${#array[*]} ${#array[@]} 表示数组中元素的个数

      a1111@1111deMacBook-Pro ~ % echo ${#a[*]}
      18

  • 掐头去尾与内容替换


    • ${value#pattern} ${value##pattern} # 表示掐头

      a1111@1111deMacBook-Pro ~ % echo ${a#h}
      oll world muchuan

    • ${value%pattern} ${value%%pattern} % 表示去尾

      a1111@1111deMacBook-Pro ~ % echo ${a%%muchuan}
      holl world

    • ${value/pattern/string} ${value//pattern/string} /表示替换

      a1111@1111deMacBook-Pro ~ % echo ${a/muchuan/par}
      holl world par

    • #与##、%与%%、/与//的区别:最短匹配模式VS最长匹配模式

    • ${value/#Pattern/Replacement} ${value/%Pattern/Replacement}


布尔变量

  • true
  • false
  • 命令执行返回值$?
    • 任何命令执行都会有一个返回值
    • 0表示正确
    • 非0表示错误

a1111@1111deMacBook-Pro ~ % ls
Applications Library Postman node_modules
Desktop Movies Public package-lock.json
Documents Music PycharmProjects sensors
Downloads Pictures Sunlogin Files
a1111@1111deMacBook-Pro ~ % echo $?
0
a1111@1111deMacBook-Pro ~ % ls 1111111111;echo $?
1
a1111@1111deMacBook-Pro ~ %

判断的类型

算术判断

  • [ 2 -eq 2 ]相等

    a1111@1111deMacBook-Pro ~ % [ 2 -eq 2 ];echo $?
    0

  • [ 2 -ne 2 ]不想等

    a1111@1111deMacBook-Pro ~ % [ 2 -ne 2 ];echo $?
    1

  • [ 3 -gt 1 ]大于

    a1111@1111deMacBook-Pro ~ % [ 3 -gt 1 ];echo $?
    0

  • [ 3 -ge 3 ]大于等于

    a1111@1111deMacBook-Pro ~ % [ 3 -ge 3 ];echo $?
    0

  • [ 3 -lt 4 ]小于

    a1111@1111deMacBook-Pro ~ % [ 3 -lt 4 ];echo $?
    0

  • [ 3 -le 3 ]小于等于

    a1111@1111deMacBook-Pro ~ % [ 3 -le 3 ];echo $?
    0

  • (())也可表示算术比较。((3>4))

    a1111@1111deMacBook-Pro ~ % ((3>4));echo $?
    1


字符串判断

  • [ string1 = string2 ] 如果两字符串相同,则结果为真

    a1111@1111deMacBook-Pro ~ % [ "qwer" = "qwer" ];echo $?
    0
    a1111@1111deMacBook-Pro ~ % [ "qwer" = "qwe" ];echo $?
    1

  • [ string1 != string2 ] 如果两字符串不相同,则结果为真

    a1111@1111deMacBook-Pro ~ % [ "qwer" != "qwe" ];echo $?
    0
    a1111@1111deMacBook-Pro ~ % [ "qwer" != "qwer" ];echo $?
    1

  • [ -n “$var” ] 如果字符串非空,则结果为真

    a1111@1111deMacBook-Pro ~ % a="qwer";[ -n "$a" ];echo $?
    0
    a1111@1111deMacBook-Pro ~ % a="";[ -n "$a" ];echo $?
    1

  • [ -z “$var” ] 如果字符串为空,则结果为真

    a1111@1111deMacBook-Pro ~ % a="";[ -z "$a" ];echo $?
    0
    a1111@1111deMacBook-Pro ~ % a="qwer";[ -z "$a" ];echo $?
    1

  • [[ “xxx” == “x” ]] 在表达式中表示0或多个字符

    a1111@1111deMacBook-Pro ~ % [[ "muchuan" == m* ]];echo $?
    0

  • [[ xxx == x?? ]]在表达式中表示单个字符

    a1111@1111deMacBook-Pro ~ % [[ "muchuan" == m?? ]];echo $?
    1

  • 在引用变量的时候要记得加双引号[ -z “$a” ] 否则当a未定义时语法会被错


逻辑判断

  • [ 2 -ge 1 -a 3 -ge 4 ] 与

    a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 -a 3 -ge 4 ];echo $?
    1

  • [ 2 -ge 1 -o 3 -ge 4 ] 或

    a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 -o 3 -ge 4 ];echo $?
    0

  • [ 2 -ge 1 && 3 -ge 4 ] 与

    a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 && 3 -ge 4 ];echo $?
    1

  • [ 2 -ge 1 || 3 -ge 4 ] 或

    a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 || 3 -ge 4 ];echo $?
    0

  • [ ! 2 -ge 1 ] 非

    a1111@1111deMacBook-Pro ~ % [ ! 2 -ge 1 ];echo $?
    1


shell内置判断

  • -e file 如果文件存在,则结果为真

    a1111@1111deMacBook-Pro ~ % [ -e package-lock.json ];echo $?
    0
    a1111@1111deMacBook-Pro ~ % [ -e package-loc.json ];echo $?
    1

  • -d file 如果文件是一个子目录,则结果为真

    a1111@1111deMacBook-Pro ~ % [ -d package-loc.json ];echo $?
    1
    a1111@1111deMacBook-Pro ~ % [ -d Music ];echo $?
    0

  • -f file 如果文件是一个普通文件。则结果为真

    a1111@1111deMacBook-Pro ~ % [ -f Music ];echo $?
    1
    a1111@1111deMacBook-Pro ~ % [ -f package-lock.json ];echo $?
    0

  • -r file 如果文件可读,则结果为真

  • -s file 如果文件长度不等于0,则结果为真

  • -w file 如果文件可写,则结果为真

  • -x file 如果文件可执行,则结果为真

  • [[]] 是 [] 的扩展语法,在老的sh里并不支持。推荐使用[]



推荐阅读
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • 深入理解Shell脚本编程
    本文详细介绍了Shell脚本编程的基础概念、语法结构及其在操作系统中的应用。通过具体的示例代码,帮助读者掌握如何编写和执行Shell脚本。 ... [详细]
  • 本文介绍如何在MSYS2环境中将Zsh设置为默认Shell,通过修改msys2.ini、mingw32.ini和mingw64.ini文件实现。 ... [详细]
  • WinSCP: 跨Windows与Linux系统的高效文件传输解决方案
    本文详细介绍了一款名为WinSCP的开源图形化SFTP客户端,该工具支持SSH协议,适用于Windows操作系统,能够实现与Linux系统之间的文件传输。对于从事嵌入式开发的技术人员来说,掌握WinSCP的使用方法将极大提高工作效率。 ... [详细]
  • Windows 环境下安装 Git 并连接 GitHub 的详细步骤
    本文详细介绍了如何在 Windows 系统中安装 Git 工具,并通过配置 SSH 密钥实现与 GitHub 的安全连接。包括下载、安装、环境配置及验证连接等关键步骤。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文将详细介绍如何在Linux操作系统中执行PHP脚本,包括环境配置、命令使用及验证方法。对于需要在Linux环境下开发或部署PHP应用的用户来说,这是一篇非常实用的文章。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 本文介绍了在MacOS上通过Homebrew安装Anaconda3,并配置环境变量以实现不同Python版本之间的快速切换。同时,提供了详细的步骤来创建和管理多个Python环境。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
author-avatar
佛山越野e族99_990
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有