2、シェル
2.1、シェルの基本的な正規表現
正規表現は、文字を表現するために使用され、文字列の論理演算式は、これらの特定の文字と「文字列ルール」を形成するための特定の文字のいくつかの組合せによって事前に定義され、この「ルール列」であります文字列フィルタ・ロジックのため。そして、いくつかの特別な構文の表記文字クラス、修飾子の数との間の位置関係を提供して、正規表現(正規表現)をあるこれらの特別な構文と一般的な性格を持つパターンを示しています。
2.1.1、通常のメタキャラクタ
文字 | 説明 |
---|---|
\ | 次の文字は特殊文字、またはリテラル文字、または後方参照、または8進数のエスケープとしてマークされています。たとえば、「n 」の文字に一致しますn 「」「\n 」改行にマッチします。シリアル\\ 「」マッチング「\ 」と「\( 」マッチ( 「」 |
^ | 文字列の先頭にマッチします。オブジェクトは正規表現Multilineプロパティを設定されている場合は、^も「一致する\n 」または「\r 位置」の後に。 |
$ | 文字列の入力端にマッチします。RegExpオブジェクトのMultilineプロパティが設定されている場合、$も「一致する\n 」または「\r 前の位置を。」 |
* | 先行部分式の0回以上一致します。例えば、ZO 「マッチをz 」とzoo 「」これは、{0}に相当します。 |
+ | 直前の部分正規表現の1回以上一致します。たとえば、「zo+ 」一致させることができます「zo 」とzoo 「」が、一致させることはできませんz 「」+ {1}と等価です。 |
? | 先行部分式0または1を一致。例えば、「do(es)? 」一致「does 」または「does 」でdo 「」?{0,1}と同等です。 |
{ N } | nは負でない整数です。決定したマッチングのn回。たとえば、「o{2} 」一致しない「Bob 」でのo 「」が、一致させることができます「food 2 Oで」を。 |
{ N } | nは負でない整数です。少なくともマッチングのn倍。たとえば、「o{2,} 」一致しない「Bob 」でのo 「」、それが一致することができます「foooood 内のすべてのOを」。「o{1,} 」に相当しますo+ 「」「o{0,} 」に相当しますo* 「」 |
{ N、M } | M及びnは負でない整数であるN <= M。少なくとも一致のn倍とまで一致のm回。たとえば、「o{1,3} 」一致します「fooooood 最初の3 Oで」。「o{0,1} 」に相当しますo? 「」コンマと二つの数字の間にスペースなしということに注意してください。 |
? | 場合、他の修飾子に直接文字(*、+、?、{ N- }、{ N-、}、{ N-、M} *)場合リア、非貪欲マッチングパターン。できるだけ少しなどの非貪欲パターン一致検索文字列、および文字列検索の限り、デフォルト貪欲なパターンが一致しました。たとえば、文字列はoooo 「」、「o+? 」シングルにマッチしますo 「」と「o+ 」すべて一致しますo 「」 |
。 | 「マッチングに加え\ n 以外の任意の一文字」。「を含む一致させる\ n 」としての使用を含む任意の文字、「(.|\n) モデル」。 |
X |と | マッチは、XまたはY。例えば、「z|food 」一致「z 」またはfood 「」「(z|f)ood 」一致「zood 」またはfood 「」 |
[XYZ] | 文字のセット。付属の任意の文字と一致します。例えば、「[abc] 」一致「plain 」でa 「」 |
[^ XYZ] | 負の文字セット。「PLIN」でたとえば、「[^ ABC]」マッチ「プレーン」、任意の文字は含まれていないにマッチします |
[AZ] | 文字の範囲。指定された範囲内の任意の文字と一致します。例えば、「[a-z] 」一致「a 」「へのz 範囲内の任意の小文字文字」。 |
[^ AZ] | 負の文字の範囲。ない任意の指定した範囲内の任意の文字と一致します。例えば、「[^a-z] 」任意に一致しない場合があり、「a 」に「z 任意の範囲」。 |
\ B | 、つまり、ワード境界に一致する単語の間に位置し、スペースを指します。例えば、「er\b 」一致「never で」er 「」ではなく、「verb 」er 「」。 |
\ B | 非ワード境界に一致します。「er\B 」マッチ「verb 」er 「」が、一致させることはできません「」never にer 「」 |
\ CX | xで指定された制御文字に一致します。たとえば、\ CMはコントロール- Mまたはキャリッジリターンと一致します。xの値は、AZまたはAZでなければなりません。それ以外の場合は、リテラル「としてC c 」の文字。 |
\ dは | 桁の文字と一致します。[0-9]に相当します。 |
\ D | 数字以外の文字をマッチング。これは[^ 0-9]と同じです。 |
\ F | フィード文字に一致します。x0cと\ CL \に相当します。 |
\ nは | 改行にマッチします。X0Aと\ cJの\に相当します。 |
\ rを | キャリッジリターンをマッチング。\ x0dと\ CMに等価。 |
\ sの | その上、スペース、タブ、改ページ、およびを含む、任意の空白文字にマッチします。これは、[V \ F \ n \ R \ T \]と等価です。 |
\ S | 任意の非空白文字にマッチします。[V \ rを\トン\ nは\ ^ \ f]のと同じです。 |
\トン | マッチングタブ。\ x09のと\ CIに相当します。 |
\ V | 垂直タブをマッチング。\ X0Bと\ CKに相当。 |
\ワット | アンダースコアを含む任意の単語文字と一致します。等価に[A-Za-z0-9_] 「」 |
\ W | 任意の非単語文字と一致します。等価に[^A-Za-z0-9_] 「」 |
| | 論理的「または」操作2つのマッチング条件。たとえば、正規表現はマッチは、「彼に属する」と「それは彼女に属している」が、「それは彼らに属している」と一致することはできません(彼女をhiml) |
() | セル群の一部を合成します。例えば、喜んまたは良い検索するために、このようにG「(laloo)d」は使用することができます。グループ+に使用することができます(の)メリット、?、等* |
たとえば、IPアドレスが取ら:~]# echo '192.168.1.1' | grep -E --color "([0-9]{1,3}\.){3}[0-9]{1,3}"
2.1.2、シェルの特殊文字
名前 | 文字 | 実用的な効果 |
---|---|---|
二重引用符 | " | 用来使shell 无法认出除字符$、‘ 、飞外的任何字符或字符串,也称之为弱引用 |
单引号 | ‘ | 用来使shell 无法认出所有特殊字符,也称之为强引用 |
反引号 | ` | 用来特换命令,将当前命令优先执行 |
分号 | ; | 允许在一行放多个命令 |
& | 后台执行,建议带上nohup | |
大括号 | {} | 创建命令块 |
字符集合 | <>& | 重定向 |
字符集合 | * ? [] ! | 表示模式匹配 |
$ | 变量名的开头 | |
# | 注释,第一行魔数除外 |
2.1.3、变量和运算符
变量是放置在内存中的一定的存储单元,这个存储单元里存放的是这个单元的值,这个值是可以改变的,我们称之为变量。
变量名=”变量”
readonly 变量名=”变量”设置该变量为只读变量,则这个变量不能被改变。
echo $变量名
set 显示本地所有的变量
unset 变量名清除变量
readonly 显示当前shell 下有哪些只读变量
2.1.3.1、特殊变量
符号 | 作用 |
---|---|
$0 | 当前脚本的名称 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。<br />例如,第一个参数是\$1,第二个参数是$2。 |
$# | 表示位置参数的总数 |
$* | 传递给脚本或函数的所有参数 |
$@ | 传递给脚本或函数的所有参数。被双引号""包含时,与 $* 稍有不同 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
2.1.3.2、示例
# 位置参数脚本 $n
]# cat location.sh
#!/bin/bash
#
echo "第一个参数: " $1
echo "第二个参数: " $2
echo "第三个参数: " $3
echo "第四个参数: " $4
]# bash location.sh 1 2 3
第一个参数: 1
第二个参数: 2
第三个参数: 3
第四个参数: # 如果不传就是空
# $# $@
]# cat shift.sh
#!/bin/bash
#
echo "总数: $#" # 获取传递参数的总数
echo "@: $@" # 获取传递参数的所有值
echo "@: "$* # 获取传递参数的所有值
]# bash shift.sh 192.168.1.1 192.168.1.2 192.168.1.3
总数: 3
@: 192.168.1.1 192.168.1.2 192.168.1.3
*\$@ 与 $ 的区别?**
- \$@ 和 \$* 都表示脚本或者函数传入的参数,不被双引号""包含时,都以 \$1 \$2 … \$n 的形式输出所有参数,
- 但是当它们被双引号 “” 包含时,
- "\$*" 会将所有的参数作为一个整体,以"\$1 \$2 … \$n"的形式输出所有参数。
- "\$@" 会将各个参数分开,以的$1 \$2 … \$n形式输出所有参数
2.1.3.3、调试shell脚本
1、脚本中加上
set -x # 打印过程
set +x # 只打印部分过程
2、直接使用 bash -x script.sh
2.1.4、退出\变量
退出: 可以利用 exit[n] ,n必须是0-255范围的整数,$?内部变量可以执行最后一条命令的退出状态, 0为true, 其它数值皆为errors
变量:Shell 变量名可以由字母、数字和下划线等字符组成,但第一个字符必须是字母或下划线
变量可以分为内部变量、本地变量、环境变量、参数变量和用户定义的变量, 以下为它们的定义:
- 内部变量:为了便于Shell 编程而由Shell 设定的变量。如错误类型的ERRNO 变量。
- 本地变量:在代码块或函数中定义的变量,且仅在定义的范围内有效。
- 参数变量:调用Shell 脚本或函数时传递的变量。
- 环境变量:为系统内核、系统命令和用户命令提供运行环境而设定的变量。
- 用户变量:为运行用户程序或完成某种特定任务而设定的普通变量或临时变量。
ps: 在赋值时 x=123, 等于号两边不能有空格,shell语法限定
2.1.4.1、内部变量
变量名 | 作用 |
---|---|
PWD | 表示当前的工作目录, 其变量值等同于pwd 内部命令的输出 |
RANDOM | 每次引用这个变量时都会生成一个均匀分布的0 ~ 32767 范围内的随机整数 |
SCONDS | 脚本已经运行的时间(单位:秒) |
PPID | 当前进程的父进程的进程ID |
$? | 表示最近一次执行的命令或shell 脚本的出口状态 |
2.1.4.2、环境变量
变量名 | 作用 |
---|---|
EDITOR | 用于确定命令行编辑所用的编辑程序,通常为vim |
HOME | 用户主目录 |
PATH | 指定命令的检索路径 |
# 将程序的执行文件加入到系统默认环境变量中,如 java
]# cat /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
]# source !$ 然后env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/jdk/bin:/root/bin:/usr/java/jdk/bin # 加入的默认 PATH
PWD=/root/testBash/231 # 当前的环境变量
JAVA_HOME=/usr/java/jdk # JAVA_HOME 路径
系统环境变量文件(重要)
配置文件读取: /etc/profile -->/etc/profile.d/*.sh -->~/.bash_profile-->~/.bashrc -->/etc/bashrc
- /etc/profile: 全局,当前系统上所有用户都可以读取到环境变量
- $HOME/.bash__profile: 当前用户的环境变量,只局限于当前这个用户
2.1.4.3、变量引用
引用变量的两种形式: \$variable 与\$ {variable }
2.1.5、部分常用命令介绍
2.1.5.1、冒号
与true 语句不执行任何实际的处理动作,但可用于返回一个出口状态为0 的测试条件。这两个语句常用于While 循环结构的元限循环测试条件,我们在脚本中经常会见到这样的使用:
while : # 这表示是一个无限循环的过程,所以使用的时候要特别注意,不要形成了死循环,所以一般会定义一个sleep 时间,可以实现秒级别的cron 任务,其语法格式为:
# ; 分号允许在一行放多个命令
while :;do echo 'yep'; sleep 3;done # 实例了一个无限循环,每隔3秒打印一次yep
2.1.5.2、echo 与print 命令
# 显示各种信息,主要用于跟awk配合,输出截取的字段详细信息如:
]# ps aux | grep jdk | grep -v "grep" | awk '{print $2}'
2.1.5.3、read
read 语句的主要功能是读取标准输入的数据,然后存储到变量参数中, 交互式标准输入,
]# cat read.sh
#!/bin/bash
#
read -p "请输入参数: " variable # 带上提示符输出, bash script.sh
echo ${variable}
默认值demo
# 倒计时,如果在5秒内没有输入任何字符,则使用字定义的value
]# cat read2.sh
#!/bin/bash
#
read -p "倒计时测试: " -t 5 variable2
va="test"
variable2=${variable2:-$va}
echo $variable2
2.1.5.4、set 与unset
- set: set 命令用于修改或重新设置位置参数的值。set --用于清除所有位置参数
- unset: 删除位置变量 如
a="hello" unset a 就清除了
2.1.5.5、expr 算术运算
符号 | 作用 | 示例 |
---|---|---|
+ | 加法 | a=10;b=20;expr $a + $b 结果为 30。注意空格 |
- | 减法 | expr $a - $b 结果为-10 |
* | 乘法 | expr $a * $b 结果为200 |
/ | 除法 | expr $b / $a 结果为2 |
% | 取余 | expr $b % $a 结果为 0 |
= | 赋值 | a=$b,将把变量 b 的值赋给 a |
(()) | 双小括号算术运算符,用于 替代expr 命令 | for((i=0;i<10;++i)) 或者((out=$a*$b)) 或者if(($a==$b));then ... fi ,无需添加空格了,更加符合 C 的编程语法 |
, | 逗号运算符 | 1、用在连接一连串的数学表达式中,这串数学表达式均被求值,但只有最后一个求值结果被返回。<br />2、用于参数替代中,表示首字母小写,如果是两个逗号,则表示全部小写,注意,这个特性在bash version 4的时候被添加的。 |
expr使用方法
#
]# cat e1.sh
#!/bin/bash
#
num1=100
num2=101
x=`expr $num1 + $num2` # 引用时注意左右空格
x1=`expr $num1 \* $num2` # 如果是 乘法 需要先转义一下
x2=`expr $num1 - $num2`
x3=`expr $num1 / $num2`
x4=`expr $num1 % $num2`
]# expr 1 + 3 也需要注意左右空格, 计算时乘法需要先转义
(())使用方法
]# cat e2.sh
#!/bin/bash
#
num1=100
num2=191
c1=$((num1+num2))
c2=$((num1-num2))
c3=$((num1*num2))
c4=$((num1/num2))
c5=$((num1%num2))
2.1.5.6、let 算术运算
let 命令取代并扩展了expr 命令的整数算术运, 如 num=100 num2=80
符号 | 作用 | 示例 |
---|---|---|
+= | 加法 | let num+=num2 结果为180<br />运算过程 let num=num+num2 |
-= | 减法 | let num-=num2 结果为20 |
*= | 乘法 | let num+=num2 结果为8000 |
/= | 除法 | let num+=num2 结果为1 |
%= | 除余 | let num+=num2 结果为20 |
2.1.6、替换符
2.1.6.1、命令替换
命令替换的目的是获取命令的输出,且为变量赋值或对命令的输出做进一步的处理。
命令替换实现的方法为采用$(... )形式引用命令或使用反向引号引用命令’ command’
today=$(date)
today=`date`
# 两个结果一样 2020年 01月 07日 星期二 13:41:15 CST
2.1.6.2、变量替换符
如 var='hello world'
字段 | 说明 |
---|---|
\${#var} | 返回变量中字符串的长度, 结果:11 |
${var} | 变量引用 |
${var:-default} | 如果var没有声明或者为空,则返回default字串,否则返回var自身的值 |
${:} | 偏移pos个字符,取余下的字串, ${var:5} 结果: world |
${::} | 偏移pos个字符,取num个字符长度的字串,用法${var:1:5} 。 结果: hello |
{,} | 逗号分割一般用于文件列表的扩展, echo {a,b}.txt,输出a.txt b.txt |
{…} | 用于顺序扩展, touch {a..d}.txt ,结果为 a.txt b.txt c.txt d.txt |
${#} | 模式匹配截断,用法${variable#pattern} ,查找值中自左而右第一次被word匹配到的串,并将此串及向左的所有内容都删除。不改变原变量 |
${##} | 模式匹配截断,用法${variable##pattern} ,查找字符串中 从左往右 匹配的深度最深的字符串,匹配完之后删除左边的所有,显示匹配右边字符串的所有值。不改变原变量。 |
${%} | 模式匹配截断,用法${variable%pattern},查找值中 从右往左 第一次被word匹配到的串,并将此串及向右的所有内容都删除。不改变原变量 |
${%%} | 模式匹配截断,用法${variable%%pattern} ,查找字符串中 从右往左 匹配的深度最深的字符串,匹配完之后删除左边的所有,显示匹配右边字符串的所有值。不改变原变量。 |
${/ /} | 模式匹配替换。${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。不改变原变量。 |
${// /} | 模式匹配替换。${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。不改变原变量。 |
]# he="hello world"
]# he2="hello world hello world"
# ${#} 左边最短匹配模式 # 如果不加* 从顶头开始
]# echo ${he#*o} # 结果为:world
]# echo ${he2#*o} # 结果为: world hello world
# ${##} 左边最长匹配模式
]# echo ${he##*o} # 结果: rld
]# echo ${he2##*o} # 结果: rld 匹配最左边最长的字符串
# ${%} 右边最短匹配模式 注意匹配 * 的位置
]# echo ${he%o*} # 结果: hello w
]# echo ${he2%o*} # 结果: hello world hello w
# ${%%} 右边最长匹配模式
]# echo ${he%%o*} # 结果: hell
]# echo ${he2%%o*} # 结果: hell
# ${/ /} 替换左起的第一个符合的字符串
]# echo ${he2/world/xiong} 结果: hello xiong hello world
# ${// /} 替换所有符合的字符串, 按最深度匹配
]# echo ${he2//world/xiong} 结果: hello xiong hello xiong
2.1.7、运算符
2.1.7.1、逻辑运算符
符号 | 作用 |
---|---|
&& 或 -a | 如果前值为true,则执行 |
|| 或 -o | 如果前值为false,则执行 |
!exp |
2.1.7.2、文件运算符
符号 | 作用 |
---|---|
-e file | 如果给定的文件存在,则条件测试的结果为真。 |
-(r|w|x) file | 如果给定的文件存在,且是可( 读, 可写,可执行的) 则测试结果为真 |
-s file | 如果给定的文件存在,且其大小大于0 |
-S file | 文件存在且是套接字(socket) |
-f file | 如果给定的文件存在,且是一个普通文件 |
-d file | 如果给定的文件存在,且是一个目录 |
-L file | 如果给定的文件存在,且是一个符号链接文件 |
-c file | 如果给定的文件存在,且是字符特殊文件 |
-b file | 如果给定的文件存在,且是块特殊文件 |
-p file | 如果给定的文件存在,且是命名的管道文件 |
linux文件类型
- 普通文件
d 目录
b 块设备
c 字符设备
p 命名管道
l 符号链接
s 套接字
测试demo
# 已知有如下文件,进行判断
]# ll /run/docker.sock
srw-rw---- 1 root docker 0 12月 30 08:41 /run/docker.sock
[root@domaster 259]# ll
drwxr-xr-x 2 root root 6 1月 7 13:52 dir
-rw-r--r-- 1 root root 0 1月 7 13:52 file
lrwxrwxrwx 1 root root 4 1月 7 13:52 link -> file
]# cat test.sh
#!/bin/bash
#
# 判断是否是套接字
[ -S '/run/docker.sock' ] && echo '是一个套接字'
# 判断是否为目录,如果不存在则创建
[ -d './dir' ] && echo '是一个目录' || mkdir ./dir
# 判断是否为文件,如果不存在则touch
[ -f './file' ] && echo '是一个文件' || touch ./file
# 判断是否为符号链接
[ -L './link' ] && echo "是一个软链接"
2.1.7.3、字符串运算符
符号 | 作用 | 示例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ \$a = \$b ] 返回 false |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ \$a != \$b ] 返回 true |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false |
-n | 检测字符串长度是否为0,不为0返回 true。 | [ -n $a ] 返回 true |
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true |
=~ | 正则表达式匹配运算符,用于匹配正则表达式的,配合[[]]使用 | if [[ ! $file =~ check$ ]] ,用于判断 $file 是否是以 check 结尾 |
demo
]# cat test.sh
#!/bin/bash
#
value1="xiong"
value2="xion222"
# 判断两个值是否相等,
[ $value1 = $value2 ] && echo 'yep' || echo '不相等'
# 获取docker的pid值,然后在获取docker.sock判断docker是否挂掉,如果都为空说明挂了
pid=`cat /run/docker.pid`
# 判断pid是否为空, 如果为空为true
[ -z '$pid' ] && echo '字符串为空' || echo '字符串有值 ' $pid
# 使用-n会更好判断, 如果不为空为true
[ -n '$pid' ] && echo $pid || echo '字符串为空'
# 判断字符串是否为空,如果非空为true
[ $value2 ] && echo '不为空' || echo '为空'
2.1.7.4、关系运算符
符号 | 作用 | 示例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ \$a -eq \$b ] 返回 true |
-ne | 检测两个数是否相等,不相等返回 true。 | [ \$a -ne \$b ] 返回 true |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ \$a -gt $b ] 返回 false |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ \$a -lt $b ] 返回 true |
-ge | 检测左边的数是否大等于右边的,如果是,则返回 true。 | [ \$a -ge $b ] 返回 false |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ \$a -le $b ] 返回 true |
[] | 一对方括号,用于判断条件是否成立 | [ \$a == $b ],注意添加 4 个空格 |
[[]] | 两对方括号是对[]的扩展,可使用<、>、&&、||等运算符 | [[ \$a>$b ]],只需要添加左右两边两个空格,<br />需要注意:使用==与!=时,仍需要4个空格 |
-
运算符 [] 与 [[]] 的区别
实际上是 Bash 中 test 命令的简写,即所有的 [ expression ] 等于 test expression。而[[ expression ]]是 Bash 中真正的条件判断语句,其语法更符合编程习惯,建议使用。
- Shell 中没有
<= 与 >=
运算符,只能使用-le 与 -ge
替代。
num=100
num2=91
# 两值相等为true 不相等
[ $num -eq $num2 ] && echo '相等' || echo '不相等'
# 两值不相等为true 不相等
[ $num -ne $num2 ] && echo '不相等' || echo '相等'
# 左边大于右边为true num大于num2
[ $num -gt $num2 ] && echo 'num大于num2' || echo 'num小于num2'
# 左边小于右边为true num大于num2
[ $num -lt $num2 ] && echo 'num小于num2' || echo 'num大于num2'
# 左边大于等于右边为true num大于等于num2
[ $num -ge $num2 ] && echo 'num大于等于num2' || echo 'num小于等于num2'
# 左边小于等于右边为true num大于等于num2
[ $num -le $num2 ] && echo 'num小于等于num2' || echo 'num大于等于num2'
2.1.8、函数
-
自定义函数 - 方式一
cat one.sh #!/bin/bash # function test() { echo "\$1, \$2: " $1 $2 echo "\$@: " $@ echo "\$*: " $* } test 10 20 # 打印结果, 特殊变量在函数中也可以使用 $1, $2: 10 20 $@: 10 20 $*: 10 20
-
方式二
]# cat two.sh #!/bin/bash # test() { # 个人更喜欢这种样式 echo 'test' }
2.1.9、数组
数组元素的下标由0 开始编号,获取数组中的元素要利用下标
2.1.9.1、定义数组
-
方式一:
array_name=(value1 value2 value3)
-
方式二:
]# array_name[0]=value0 ]# array_name[1]=value1 ]# array_name[2]=value2
2.1.9.2、读取数组
符号 | 作用 |
---|---|
${value[index]} | 取出数组的索引值, 从0开始 |
${value[*]} | 获取数组中所有的值 |
${value[@]} | 获取数组中所有的值 |
${#value[@]} | 获取当前数组有多少个值 |
${#value[index]} | 获取单个字符串长度,不加index就是0 |
${value[*]::} | ${数组名[@或*]:开始下标:结束下标} |
${value[*]//} | 数组值替换,不改变原字符串,${数组名[@或*]/模式/新值} |
]# echo ${array_name[2]} # 结果: value2
]# echo ${array_name[*]} # 结果: value0 value1 value2
]# echo ${array_name[@]} # 结果: value0 value1 value2
]# echo ${#array_name[*]} # 结果:3
]# echo ${#array_name[1]} # 结果:6
]# echo ${#array_name} # 结果: 6 默认下标为0
]# echo ${array_name[@]:0:1} # 结果: value0
]# echo ${array_name[@]:1} # 结果: value1 value2
]# echo ${array_name[@]/value1/test} # 结果: value0 test value2
# 数组遍历打印
]# for v in ${array_name[@]};do echo $v;done
-
如果该下标元素已经存在,会怎么样?
答:会修改该下标的值为新的指定值。 例如:array_name[2]=100,数组被修改为(value0 value1 100)
-
如果指定的下标已经超过当前数组的大小,如上述的arr_number的大小为2,指定下标为10或者11或者大于2的任意值会如何?
答:新赋的值被追加到数组的尾部。 例如:arr_number[13]=13,数组被修改为(value0 value1 value2 13)
2.1.9.3、删除操作
清除某个元素:unset arr_number[1],这里清除下标为1的数组;
清空整个数组:unset arr_number;
2.2、shell中控制流结构
Shell 中的控制结构
- if ... then ... else ... fi
- case 语句 ;; esac
- for 循环
- until 循环
- while 循环
- break 控制
- continue 控制
ps: 一般工作脚本用的最多就是 if for case while
# 如 if 每个 ; 都做为换行
if 条件; then 语句; else 语句; fi
# 如 if else if
if 条件; then 语句 else if 条件;then 语句; else; 命令; fi
# case用的最多,systemD风格脚本, centos 7.4以后已不在使用
#!/bin/bash
#
read -p "请输入选项: " -t 5 CHIOSE
AUTO_CHIOSE=3
CHIOSE=${CHIOSE:-$AUTO_CHIOSE} # 超时就打印帮助选项,
case $CHIOSE in
1|start)
echo 'start|1' ;;
2|stop)
echo "stop|2" ;;
3|other)
echo -e "\t\tUsage scrpt ( start | stop | other )\n\n" ;;
esac
# for 的几种用法
#!/bin/bash
#
for i in {1..10};do # 用花括号直接展开,这个最方便
echo $i
done
# seq [起如数 [步进长度]] 结束数`
for u in `seq 1 1 10`;do # 如果有开发,使用这种就一目了然,序号步进
echo "u: "$u
done
for ((i=0;i<=10;i++ ));do # 这种叠加也不错, 个人用的少,第一种多
echo $i
done