热门标签 | 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里并不支持。推荐使用[]



推荐阅读
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 在Android应用开发过程中,开发者经常遇到诸如CPU使用率过高、内存泄漏等问题。本文将介绍几种常用的命令及其应用场景,帮助开发者有效定位并解决问题。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 本文详细介绍了C++中的构造函数,包括其定义、特点以及如何通过构造函数进行对象的初始化。此外,还探讨了转换构造函数的概念及其在不同情境下的应用,以及如何避免不必要的隐式类型转换。 ... [详细]
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • 在开发板的启动选项中看到如下两行:7:LoadBootLoadercodethenwritetoFlashviaSerial.9:LoadBootLoadercodethenwri ... [详细]
  • 本文介绍了如何使用开源工具ChkBugReport来解析和分析Android设备的Bugreport。ChkBugReport能够将复杂的Bugreport转换为易于阅读的HTML报告,并提供详细的图表和分析结论。 ... [详细]
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社区 版权所有