记录shell学习过程中的一些知识点

记录shell学习过程中的一些知识点

Shell 运⾏环境概念

  • bash是⼀个进程
    • ​ bash下还可以再重新启动⼀个shell,这个shell是sub shell,原shell会复制 ⾃⾝给他
    • ​ 在sub shell中定义的变量,会随着sub shell的消亡⽽消失
  • () ⼦shell中运⾏
  • {} 当前shell中执⾏
  • $$ 当前脚本执⾏的pid
  • & 后台执⾏
  • $!运⾏在后台的最后⼀个作业的PID(进程ID)

常用命令

​ echo 用于字符串的输出

​ 使用 $var 或 ${var} 来访问变量。后者更为严谨。

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

[root@VM-0-12-centos ~]# a=1
[root@VM-0-12-centos ~]# echo $a
1
[root@VM-0-12-centos ~]# echo $a_1

[root@VM-0-12-centos ~]# echo ${a}_1
1_1

变量定义

变量定义方法/原则

= 左右不能有空格
[root@VM-0-12-centos ~]# a = 1
-bash: a: command not found
如果内容有空格,需要使用单引号或者双引号
[root@VM-0-12-centos ~]# a=hello word
-bash: word: command not found
[root@VM-0-12-centos ~]# a='hello word'
[root@VM-0-12-centos ~]# echo $a
hello word
双引号用于括起一段字符串值,支持$var 形式的变量替换

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

[root@VM-0-12-centos ~]# a=1
[root@VM-0-12-centos ~]# echo 'hello $a'
hello $a
[root@VM-0-12-centos ~]# echo "hello $a"
hello 1
\反斜线, 某些情况下表示转义
[root@VM-0-12-centos ~]# a="hello world \"haha\""
[root@VM-0-12-centos ~]# echo $a
hello world "haha"

​ $开头的变量会被自动替换

大小写敏感
[root@VM-0-12-centos ~]# a=1
[root@VM-0-12-centos ~]# A=2
[root@VM-0-12-centos ~]# echo $a
1
[root@VM-0-12-centos ~]# echo $A
2
`反引号可以执行命令
[root@VM-0-12-centos ~]# a=`ls`
[root@VM-0-12-centos ~]# echo $a
apache-ant-1.9.15-bin.tar.gz apache-jmeter-5.3.tgz chromedriver_linux64.zip chromedriver_linux64.zip.1 employees_db employees_db-full-1.0.6.tar.bz2 gradle-6.3-all.zip jdk-8u261-linux-x64.tar.gz learning-API-test mysql-community-release-el7-5.noarch.rpm openssl openssl-1.1.1h openssl-1.1.1h.tar.gz Python-3.8.5 Python-3.8.5.tgz Python-3.8.5.tgz.1 sdk-tools-linux-3859397.zip
[root@VM-0-12-centos ~]# date
Tue Oct 20 17:47:24 CST 2020
[root@VM-0-12-centos ~]# echo `date`
Tue Oct 20 17:47:27 CST 2020
({1..10}) 等价于 seq 1 10。表示1到10
[root@VM-0-12-centos ~]# a=({1..10})
[root@VM-0-12-centos ~]# echo ${a[*]}
1 2 3 4 5 6 7 8 9 10
$(()) 对变量进行操作。比如相加
[root@VM-0-12-centos ~]# a=2;b=4
[root@VM-0-12-centos ~]# echo $((a+b))
6
[root@VM-0-12-centos ~]# c=5;d=10;e=10
[root@VM-0-12-centos ~]# echo $((c*d-e))
40

变量类型

  • 字符串: a=“xxxx”
    取值
    • ${value:offset}  ${value:offset:length} 从变量中提取⼦串

      [root@VM-0-12-centos ~]# a="hello shell by linux"
      [root@VM-0-12-centos ~]# echo ${a:6}
      shell by linux
      [root@VM-0-12-centos ~]# echo ${a:6:6}
      shell
      [root@VM-0-12-centos ~]# echo ${a:6:3}
      she
      [root@VM-0-12-centos ~]# echo ${a:6:10}
      shell by l
      
    • ${#value} 字符串长度

      [root@VM-0-12-centos ~]# a="hello shell by linux"
      [root@VM-0-12-centos ~]# echo ${#a}
      20
      
    • ${#array[*]}和${#array[@]}表⽰数组中元素的个数

      数组变量

      括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

      数组名=(值1 值2 ... 值n)
      

      例如:

      array_name=(value0 value1 value2 value3)
      

      读取数组

      读取数组元素值的一般格式是:

      ${数组名[下标[1]]}

      例如:

      valuen=${array_name[n]}
      

      使用 @ 符号可以获取数组中的所有元素,例如:

      echo ${array_name[@]}
      

      获取数组的长度

      获取数组长度的方法与获取字符串长度的方法相同,例如:

      # 取得数组元素的个数
      length=${#array_name[@]}
      # 或者
      length=${#array_name[*]}
      # 取得数组单个元素的长度
      lengthn=${#array_name[n]}
      
    掐头去尾与内容替换
    • ${value#pattern} ${value##pattern} #表⽰掐头

      [root@VM-0-12-centos ~]# echo ${a#hello}
      shell by linux
      [root@VM-0-12-centos ~]# echo ${a##hello}
      shell by linux
      [root@VM-0-12-centos ~]# echo ${a##*l}
      inux
      [root@VM-0-12-centos ~]# echo ${a#*l}
      lo shell by linux
      
    • ${value%pattern} ${value%%pattern} %表⽰去尾

      [root@VM-0-12-centos ~]# echo ${a%linux}
      hello shell by
      [root@VM-0-12-centos ~]# echo ${a%%linux}
      hello shell by
      [root@VM-0-12-centos ~]# echo ${a%l*}
      hello shell by
      [root@VM-0-12-centos ~]# echo ${a%%l*}
      he
      
    • ${value/pattern/string} ${value//pattern/string} /表⽰替换

      [root@VM-0-12-centos ~]# echo $a
      hello shell by linux
      [root@VM-0-12-centos ~]# echo ${a/by/to}
      hello shell to linux
      [root@VM-0-12-centos ~]# echo ${a//by/to}
      hello shell to linux
      
    • #与## %与%% /与//的区别:最短匹配模式VS最长匹配模式

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

      [root@VM-0-12-centos ~]# echo ${a/#hello/good}
      good shell by linux
      [root@VM-0-12-centos ~]# echo ${a/%linux/to}
      hello shell by to
      
  • 数字:i=12132
    数字型变量操作
    [root@VM-0-12-centos ~]# i=1;echo $((i+1)) #计算
    2
    [root@VM-0-12-centos ~]# ((i=i+1));echo $i	#更新
    2
    [root@VM-0-12-centos ~]# awk 'BEGIN{print 1/3}'	#浮点数运算
    0.333333
    
  • 布尔: a=true;b=false

    ​ $?,用于输出上一条命令的执行结果,成功为0,失败为1

    [root@VM-0-12-centos ~]# a=5;b=10
    [root@VM-0-12-centos ~]# ((a>b))
    [root@VM-0-12-centos ~]# echo $?
    1
    [root@VM-0-12-centos ~]# ((a<b))
    [root@VM-0-12-centos ~]# echo $?
    0
    

预定义变量

[root@VM-0-12-centos ~]# echo $PWD
/root
[root@VM-0-12-centos ~]# echo $USER
root
[root@VM-0-12-centos ~]# echo $HOME
/root
[root@VM-0-12-centos ~]# echo $PATH
/usr/local/jmeter/apache-jmeter-5.3/bin:/usr/local/java/jdk1.8/bin:/usr/local/ant/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/java/jdk1.8/bin:/usr/local/java/jdk1.8/jre/bin:/opt/android/sdk:/opt/android/sdk/tools:/opt/android/sdk/platform-tools:/opt/android/sdk/emulator:/opt/android/sdk/tools/bin:/opt/gradle/gradle-6.3/bin:/root/bin:/root/bin

  1. 从 0 开始 ↩︎

posted @ 2025-09-29 15:07  LauTianen  阅读(10)  评论(0)    收藏  举报