变量、字符串
-
定义变量+查看变量值
name=jerry #定义变量值 # echo $name jerry #查找变量值
-
变量类型:运行shell时,会同时存在三种变量
-
局部变量:仅在当前shell实例中有效,其他shell启动程序不能访问局部变量,通常用于函数本地
local VAR_NAME=VALUE
-
环境变量:所有的程序,包括启动shell的程序,都能访问环境变量
##对当前shell进程及其子shell有效,对其它的shell进程无效 定义:export VAR_NAME=VALUE 导出:export VAR_NAME 撤消变量:unset VAR_NAME 只读变量:readonly VAR_NAME
-
shell变量:由shell程序设置的特殊变量,其中有一部分是环境变量,有一部分是局部变量
$1,$2...,${10} ## 如下执行脚本a.sh bash a.sh 1 2 3 ## $1即为第一个参数1 $2及为第二个参数 2
-
位置变量:用来接收变量指定位置的参数
-
特殊变量:shell对一些参数做特殊处理,这些参数只能被引用而不能被赋值
$# 传递到脚本的参数个数 $* 显示所有向脚本传递的参数 #与位置变量不同,此选项参数可超过9个 $$ 获取当前shell的进程号 $! 执行上一个指令的进程号 $? 获取执行的上一个指令的返回值 #0为执行成功,非零为执行失败 $- 显示shell使用的当前选项,与set命令功能相同 $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数
-
-
定义变量规范
-
变量名可以由字母、数字和下画线组成,但是不能以数字开头,不能使用程序中的关键字(保留字),要见名知义。如果变量名是"20name或者if",则是错误的
-
在 Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型
[root@localhost ~]# aa=1+2 [root@localhost ~]# echo $aa 1+2 #可见输出类型为字符串“1+2”,而不是3
-
变量用等号"=“连接值,”="左右两侧不能有空格
-
变量值中如果有空格,则需要使用单引号或双引号包含,如 test=“hello world!”。双引号括起来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符。
-
在变量值中,可以使用转义符
"\"
-
如果需要増加变量值,那么可以进行变量叠加。 l例如:
[root@localhost ~]#test=123 #叠加变量test,变量值变成了123456 [root@localhost ~]#test=${test}456 [root@localhost ~]# echo $test 123456
-
如果要把命令的执行结果作为变量值赋予变量,则需要使用反引号或 $() 包含命令。例如
##$()引用执行结果 [root@localhost ~]# test=$(date) [root@localhost ~]# echo $test Tue Feb 4 14:50:45 CST 2020 ##反引号 引用执行结果 root@Test-old-web01:~# test=`date` root@Test-old-web01:~# echo $test Tue Feb 4 14:51:19 CST 2020
-
环境变量名建议大写,便于区分。
删除变量
使用unset 永陵可以删除变量
unset variable_name
变量删除后不能再次使用。unset命令不能删除只读变量,readonly定义的变量叫做只读变量
#!/bin/sh
myUrl="http://www.educoder.net"
unset myUrl
echo $myUrl
##输出为空,是因为myurl已经被删除了
字符串
-
引号的区别
- 无引号:依次输出
#! /bin/bash var="aaa bbb ccc" echo ${var} ##输出结果为 aaa bbb ccc
- 单引号 :无法解析变量,只会原样输出
#! /bin/bash var="aaa bbb ccc" echo '${var}' ##输出结果为 ${var} ###单引号无法解析变量,只会原样输出
- 双引号:和原来一样的输出
#! /bin/bash var="aaa bbb ccc" echo "${var}" ##输出结果为 aaa bbb ccc
- 反引号
例1 $ echo the date is `date` the date is Tue Feb 4 18:08:12 CST 2020 #这里的反引号 `date` 及为命令"date" 的结果,因此像引用一个命令返回的结果作为变量用 反引号 替换,也可以使用 $(date)的方式来替换使用命令结果 例2 $ abc=`echo The number of users is \`who| wc -l\`` $ echo $abc The number of users is 4 ## 这里 `who|wc -l` 是指 返回的正在登录系统的用户的个数的结果 为4 ## 因为反引号嵌套了反引号,所以在需要加上\转义
字符串基本使用用法
-
字母串提取测试
- 获取长度
string="abcdefg" echo ${#string}
- 截取子串:从0 开始算
${string:position} #在$string中, 从位置$position开始提取子串 ${string:position:length} #在$string中, 从位置$position开始提取长度为$length的子串
string="abc12342341" echo ${string:4} #2342341 从第4位开始截取后面所有字符串 echo ${string:3:3} #123 从第3位开始截取后面3位 echo ${string:3:6} #123423 从第3位开始截取后面6位 echo ${string: -4} #2341 :右边有空格 截取后4位 echo ${string:(-4)} #2341 同上 echo ${str:(-6):5} #34234 从倒数第6个位置向左提取5个字符字符串 # 从string字符串左边第一次出现*chars的位置开始,截取*chars右边的所有字符 ${string#*chars} # 从string字符串左边最后一次出现*chars的位置开始,截取*chars右边的所有字符 ${string##*chars} # 从string字符串右边第一次出现chars*的位置开始,截取chars*左边的所有字符 ${string%chars*} # 从string字符串右边最后一次出现chars*的位置开始,截取chars*左边的所有字符 ${string%%*chars*}
- 字符串删除
${string#substring} #从变量$string的开头, 删除最短匹配$substring的子串 ${string##substring} #从变量$string的开头, 删除最长匹配$substring的子串 ${string%substring} #从变量$string的结尾, 删除最短匹配$substring的子串 ${string%%substring} #从变量$string的结尾, 删除最长匹配$substring的子串
test='c:/windows/boot.ini' $ echo ${test#/} #(从头匹配斜杠/,删除匹配到最短的斜杠,没有匹配到,所以没有删除) c:/windows/boot.ini $ echo ${test#*/} #(删除 从头匹配删除匹配到最短以/结尾的字符串,*是匹配0个或者多个) windows/boot.ini $ echo ${test##*/} #(删除 从头匹配匹配到最长的以/结尾的字符串,通常可以用来获取到文件名) boot.ini $ echo ${test%/*} #(删除 从尾部匹配以/开始最短的字符串,通常可以获取到文件路径前缀) c:/windows $ echo ${test%%/*} #(删除 从尾部匹配以/开始最长的字符串) c:
- 字符串替换
表达式规则 ${string/substring/replacement} #使用$replacement, 来代替第一个匹配的$substring ${string//substring/replacement} #使用$replacement, 代替所有匹配的$substring ${string/#substring/replacement} #如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring ${string/%substring/replacement} #如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
#测试列子: str="apple, tree, apple tree" echo ${str/apple/APPLE} # 替换第一次出现的apple APPLE, tree, apple tree echo ${str//apple/APPLE} # 替换所有apple APPLE, tree, APPLE tree echo ${str/#apple/APPLE} # 如果字符串str以apple开头,则用APPLE替换它 APPLE, tree, apple tree echo ${str/%apple/APPLE} # 如果字符串str以apple结尾,则用APPLE替换它(str是以tree结尾的) apple, tree, apple tree #测试列子2: $ test='c:/windows/boot.ini' $ echo ${test/\//\\} #(匹配的为\/,匹配的子串/需要转义,所以添加\,同理替换的字符串\转义为\\) c:\windows/boot.ini $ echo ${test//\//\\} c:\windows\boot.ini #${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。
- 字符串比较:四种判断方式 == != < > (按 ascii 值比较大小), == 相等则为真,!= 不相等则为真
#字符串比较 str="bacd" ##判断字符串是否相等 这里的== 也可以换做 = 但是一般情况下使用== if [ "$str"x == "abcdsd"x ]; then echo "相等" fi ##不相等则为真 if [ "$str"x != "abcdsd"x ]; then echo "不相等" fi ##注意 比较字符串是否相等,可以字符串后面+上个别的字符,如果str为空的话,可以防止表达式报错:[: =: unary operator expected
第一关
cd /opt/
vi test.sh
echo "Hello EduCoder"
#退出vim Ctrl+c :wq
chmod +x /opt/test.sh
第二关
cd /opt/
vi test2.sh
echo "$#"
echo "$1"
#退出vim Ctrl+c :wq
chmod +x test2.sh
./test2.sh "www" "educoder" "net"
第三关
##1、str1 为 替换string1中第一次出现的 "Hello"为"hello"后的字符串
str1=${string1/Hello/hello}
##2、str2 为 替换string1中所有的"Hello"为"hello"后的字符串
str2=${string1//Hello/hello}
##3、str3 为 删除string1中的字符串"Kubernetes,"后的字符串
str3=${string1/Kubernetes,}
length=${#string1}