微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

认识Bash一:变量的理解

背景

操作系统简史
  • 贝尔实验室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里并不支持。推荐使用[]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐