记录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
从 0 开始 ↩︎

浙公网安备 33010602011771号