变量
变量替换
- ${变量名**#**匹配规则}
- 从变量开头进行规则匹配,将符合最短的数据删除
- ${变量名**##**匹配规则}
- 从变量开头进行规则匹配,将符合最长的数据删除
- 贪婪模式
- $(变量名**%**匹配规则}
- 从变量尾部进行规则匹配,将符合最短的数据删除
- $(变量名%%匹配规则}
- 从变量尾部进行规则匹配,将符合最长的数据删除
- $(变量名**/**旧字符串/新字符串)
- 变量内容符合旧字符串则,则第一个旧字符串会被新字符串取代
- ${变量名**//**旧字符串/新字符串}
- 变量内容符合旧字符串则,则全部的旧字符串会被新字符串取代
- 变量内容符合旧字符串则,则全部的旧字符串会被新字符串取代
注意:使用expr,索引计数是从1开始计算;使用${string:position},索引计数是从0开始计数
计算字符串长度
- $(#string}无
- expr length “$string”
- string有空格,则必须加双引号
获取子串在字符串中的索引位置
- expr index $string $substring
计算子串长度
- expr match $string substr
- 只能从头开始查找
抽取字串
- ${string:position}
- 从string中的position开始
- ${string:position:length}
- 从position开始,匹配长度为length
- $(string:-position}
- 从右边开始匹配
- ${string:(position)}
- 从左边开始匹配
- expr substr $string Sposition $length
- 从position开始,匹配长度为length
案例
需求描述:
变量string="Bigdata process framework is Hadoop“执行脚本后,打印输出string字符串变量,并给出用户以下选项:
(1)、打印string长度
(2)、删除字符串中所有的Hadoop
(3)、替换第一个Hadoop为Mapreduce
(4)、替换全部Hadoop为Mapreduce
用户输入数字1,2,3,4,可以执行对应项的功能;输入qlQ则退出交互模式
#!/bin/bash
#
string="Hadoop Mapreduce"
function print_tips
{
echo "****************"
echo "(1)打印string长度"
echo "(2)删除字符串中所有的Hadoop"
echo "(3)替换第一个Hadoop为Mapreduce"
echo "(4)替换全部Hadoop为Mapreduce"
echo "****************"
}
function len_of_string
{
echo "${#stringi}"
}
function del_hadoop
{
echo "${string//Hadoop/}"
}
function rep hadoop mapreduce _first
{
echo "${string/Hadoop/Mapreduce}"
}
function rep hadoop mapreduce_all
{
echo "${string//Hadoop/Mapreduce}"
}
while true
do
echo "[string=$string]"
echo
print_tips
read -p "input your choice 1 2 3 4 q Q" choice
case $choice in
1)
1en_of_string
;;
2)
del_hadoop
;;
3)
rep hadoop mapreduce first
;;
4)
rep hadoop mapreduce all
;;
q|Q)
exit
;;
*)
echo "error"
;;
命令替换
command
- $(command)
获取系统得所有用户并输出
cat /etc/passwd | cut-d ":" -f 1
#!/bin/bash
#
index = 1
for user in `cat /etc/passwd | cut-d ":" -f 1`
do
echo "this is $index user: $user"
index = $(($index+1))
done
根据系统时间计算今年或明年
$(($(date+%Y)+1))
根据系统时间获取今年还剩下多少星期,
(((((((date +%j)/7))
判定nginx进程是否存在,若不存在则自动拉起该进程
#!/bin/bash
#
nginx_process_num=$(ps-ef I grep nginx I grep-v grep I wc-1)
if [ $nginx process num-eq 0];then
systemctl start nginx
fi
``和$()两者是等价的,但推荐初学者使用$(),易于掌握;缺点是极少数UnIx可能不支持$(())
主要用来进行整数运算,包括加减乘除,引用变量前面可以加$,也可以不加$
有类型变量
- declare命令和typeset命令两者等价
- declare、typeset命令都是用来定义变量类型的
- declare
- -i 将变量设为整数
- -a 将变量定义为数组
- -f 显示此脚本前定义过的所有函数及内容
- -F 仅显示此脚本前定义过的函数名
- -x 将变量声明为环境变量
declare -a array
array=("jones""mike""kobe""jordan")
echo ${array[@]}
expr
- expr $num1 operator $num2
- ((((((num1 operator $num2))
- num1| nurm2
- num1不为空且非0,返回num1;否则返回num2
- num1&num2
- num1不为空且非0,返回num1;否则返回0
- num1<num2
- num1小于num2,返回1;否则返回0
- num1<=num2
- num1小于等于num2,返回1;否则返回0
- num1=num2
- num1等于num2,返回1;否则返回0
- num1!=num2
- num1不等于num2,返回1;否则返回0
- num1>num2
- num1大于num2,返回1;否则返回0
- num1>=num2
- num1大于等于num2,返回1;否则返回0
grep
- 第一种形式:grep [option][pattern][file1,file2…]
- 第二种形式:command Igrep [option][pattern]
- -v 不显示匹配行信息
- -i 搜索时忽略大小写
- -n 显示行号
- -r 递归搜索
- -E 支持扩展正则表达式 egrap
- -F 不按正则表达式匹配,按照字符串字面意思匹配
- -c 只显示匹配行总数
- -w 匹配整词
- -x 匹配整行
- -l 只显示文件名,不显示内容
- -s不显示错误信息