很久没写shell脚本了,最近在帮助新同学学习shell,所以也顺便整理一下,算是一个学习笔记。
使用变量
首先显示消息,最基本的echo命令,echo后面的字符串会直接显示控制台显示器上。
echo "this is shell"
看个人习惯吧,单引号,双引号都可以,不加也可以。如果字符串中含有单引号或者双引号,就用另一种将字符串划定起来,这边的变量可以是环境变量也可以是用户变量。
- 环境变量
echo HOME:$HOME ----HOME:/home/work
echo PATH:${PATH} HOME:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/apps/openresty/nginx/sbin:/opt/apps/php/bin:/home/work/.local/bin:/home/work/bin
echo PATH:\$PATH -----HOME:$PATH \允许shell将$解读为实际的美元符号
- 用户变量
name="shell"
echo {name} 或者echo name ----shell
name2=$name
echo name2 ----shell
字符串相关
name="this is mike"
echo ${name} --- this is mike
echo ${#name} ---12 获取字符串长度
- 字符串截取
echo ${name:0:4} ---从左往右第一个截取至第四个 this
echo ${name:4} --- 从左往右第四个开始截取至最后 is mike
echo ${name:0-4:7} ---从右往左算起0-4个,截取3个 mik
echo ${name:0-4} ---从右往左截取4个 is mike
echo ${name#*s} --- 从第一个s截取 is mike
echo ${name##*s} --- 贪婪匹配 mike
echo ${name%i*} ---从右往左匹配 this is m
echo ${name%%i*} ---贪婪匹配 th
- 字符串替换
echo ${name/is/iss} ---替换第一个is thiss is mike
echo ${name/is/iss} ---贪婪匹配,替换所有is thiss iss mike
echo ${name/#*s/iss} --- iss mike
echo ${name/%i*/iss} --- thiss
- expr的字符串操作
expr index "$name" i --- 3 查找i的索引(从1开始计数)
expr length "$name" ---name的长度
expr match "$name" this ---4
expr substr "$name" 3 4 --- s is 返回一个以 StartPosition 的字符开始的在 String1 中的字符串,并且是 Length 长度的字符串(substr String1 StartPosition Length)
数组相关
数组也是用户变量的一种,能够存储多个值的变量,可以单独引用,也可以作为整个数组来引用
- 数组定义
name=(this is mike)
-------------------
name[0]=this
name[1]=is
name[2]=mike
-------------------
str="this is mike"
name=($str)
- 操作数组
name=(hello everyone my name is mike)
echo ${name} --- hello
echo ${name[2]} --- my
echo ${name[@]} ---hello everyone my name is mike (通配符也可以换乘 *)
-------------------
echo ${#name[*]} --- 6 数组长度
-------------------
name[3]=haha ---数组赋值
echo ${name[*]} --- hello everyone my haha is mike
name[6]=haha
echo ${name[*]} --- hello everyone my haha is mike haha
name2=(${name[*]} haha) 新数组=(旧数组 新元素)
echo ${name2[*]} --- hello everyone my haha is mike
------------------- 数组切片
echo ${name[*]::2} ---hello everyone 从索引为0往后打印2位
echo ${name[*]:1:2} ---everyone my 从索引为1往后打印2位
echo ${name[*]:2} ---my name is mike 从索引为2往后全部打印
echo ${name[*]:(-4:2)} --- name is 从倒数第四个往后打印2位
------------------- 数组替换
echo ${name[*]/e/E} --- 将每一个元素中第一个e替换为E hEllo Everyone my namE is mikE
echo ${name[*]//e/E} --贪婪匹配,将所有e都替换 hEllo EvEryonE my namE is mikE
echo ${name[*]/e/} ---如果后面不跟替换的值,可以理解为删除, hllo veryone my nam is mik
echo ${name[*]/#m/M} ---每个元素最左边的m,替换为M
echo ${name[*]/%e/E} ---每个元素最右边的e,替换为E
------------------- 数组匹配
echo ${name[*]#*e} --- llo veryone my is *e的部分都会被删除
echo ${name[*]##*e} ---贪婪匹配 llo my is
重定向
用得比较多的是输出重定向,将某个命令的输出不仅仅是显示在控制器显示器上,而是重定向到一个文件中。
today=$(date +%Y%m%d)
ls >log.$today
这边有两个点:
- 将date格式化后传给变量today,today值为20180626
- 重定向
查看log.20180626
$ cat log.20180626
log.20180626
try.sh
使用> 如果输出文件已经存在了,会用新的文件覆盖已有文件,如果不想覆盖原来文件的内容,想在原有文件基础上追加,使用>>来追加数据
pwd >>log.$today
检查文件
$ cat log.20180626
log.20180626
try.sh
/home/work/hpc/test/shell
网友评论