Day04 字符串截取&字符串初值&数组&字符串替换

一、字符串截取

":"代表截取

1.1 ${var:起始位置:长度}

起始位置从0开始(为0可以省略)
x=13918581996
echo ${x::5}#只取前5位数字
13918

1.2 expr substr "$var" 起始位置 长度

起始位置从1开始
x=13918581996
expr substr "$x" 1 5
13918

1.3 cut -b 起始位置-结束位置

按照顺序截取,起始位置从1开始
echo $x|cut -b 1-5
13918

1.3.1 cut -b 位置1,位置2,位置3

echo $x|cut -b 1,2,3,4,5
13918
echo $x|cut -b 5,4,3,2,1
13918

二、路径分割

2.1 dirname "$var"

截取目录位置
y=/etc/httpd/conf/httpd.conf
dirname $y
/etc/httpd/conf

2.2 basename "$var"

截取文件位置
y=/etc/httpd/conf/httpd.conf
basename $y
httpd.conf

三、字符串替换

"/"代表替换

3.1 echo ${var/old/new}

只替换第一个匹配结果。即只把最近的一个old替换成new,"/"符号表示替换一个。花括号里面支持通配符
echo ${x/1/}
3918581996

3.2 echo ${var//old/new}

替换全部匹配结果。即把所有的old替换成new,"//"符号表示全部替换
echo ${x//1/}
39858996

四、字符串掐头去尾

"#"代表掐头;"%"代表去尾

4.1 字符串掐头

4.1.1 从左往右删(最长匹配删除)

#代表从左往右删,##表示最长匹配
我想知道root用户使用的解释器是哪个?
n=head -1 /etc/passwd
echo ${n##:} #""匹配所有 ":"符合也一样会删除
/bin/bash

4.1.2 从左往右删(最短匹配删除)

#代表从左往右删,最短匹配
我想知道root用户是否配置了密码?
n=head -1 /etc/passwd
echo ${n#*:}
x:0:0:root:/root:/bin/bash

4.2 字符串去尾

4.2.1 从右往左删(最长匹配删除)

%代表从右往左删,%%表示最长匹配
我想知道passwd的第一行用户是谁?
n=head -1 /etc/passwd
echo ${n%%:*}
root

4.2.2 从右往左删(最短匹配删除)

%代表从右往左删,最短匹配
我想把root的用户的解释器删掉
n=head -1 /etc/passwd
echo ${n%:*}
root:x:0:0:root:/root

五、字符串初值判断

5.1 echo ${var:-value}

若变量var已存在且非Null,则返回 $var的值;否则返回字串“value”
即尝试显示$var的值,如果之前有赋值就显示赋值内容;如果变量不存在或未赋值,则显示:-后面的value
echo ${pass:-123456}
123456 #此时显示的是value
pass=8888
echo ${pass:-123456}
8888#现在显示的是给$pass赋的值

六、数组

6.1 定义

一个变量可以存多个值,值默认为文本,用在数学运算中时,自动将其转换为整数。数组最大的好处是如果要存的值数量很多,可以在一行里面定义完成
6.2数组赋值格式

6.2.1 数组名=(值1 值2 值3 ...)

整体赋值,下标从0开始
SVRS=(www ftp mail game)
echo ${SVRS[]}
www ftp mail game
还可以对值进行修改
SVRS[3]=bbs
echo ${SVRS[
]}
www ftp mail bbs

6.2.2 数组名[下标]=值

为单个元素赋值,下标从0开始
FQDN[0]=www.tmooc.cn
FQDN[1]=www.baidu.com

6.3 输出数组元素

6.3.1 ${数组名[下标]}

输出单个数组元素

6.3.2 ${数组名[@]}

获取所有数组元素

6.3.3 ${#数组名[@]}

获取所有数组元素个数

6.3.4 ${数组名[@]:起始下标:元素个数}

获取连续的多个数组元素

6.3.5 ${#数组名[下标]}

获取某个元素的长度

6.3.6 ${数组名[下标]:起始下标:字符数}

截取单个数组元素的一部分(包含起始下标字符本身)

七、expect预期交互

7.1 简介

基于TCL语言编写的自动交互式程序,可以用在Shell脚本中,为交互式过程自动输送预先准备的文本或者指令,而无需人工干预。
触发条件是预期会出现的特征提示文本,只要出现就给命令,只要出现就发文本等等

7.2 格式

#!/usr/bin/expect #指定脚本解释器
set host #定义变量
set timeout #定义超时时间,单位为秒
spawn #创建交互式进程壳
expect {
"特征文本" {send "命令"}
} #根据特征文本执行相应命令
exp_continue #前面的exepct条件满足后,继续执行后面的语句
interact #expect脚本执行完毕后不退出,控制权交给expect控制台

7.3 脚本示例

自动远程登录服务器执行命令后退出
bash脚本:
#!/bin/bash
host=192.168.4.7
user=root
pass="123456"
expect << EOF
spawn ssh [email protected]$host
expect "password" {set timeout 180;send "$pass\r"}
expect "#" {send "cat /etc/redhat-release\r"}
expect "#" {send "ls"}
EOF
interact
expect脚本:
#!/usr/bin/expect
set host 192.168.4.7
set user root
set pass "123456"
spawn ssh [email protected]$host
expect {
"yes" {send "yes\r" ;exp_continue}
"password" {set timeout 180;send "$pass\r";exp_continue}
"[$user\@" {send "cat /etc/redhat-release\r"}
"#" {send "ls"}
}
interact

7.4 存在问题

7.4.1 出现yes/no的情况不一定

因为有些电脑之前保存过密钥,有些没保存过

7.4.2 ssh连接比较慢导致expect脚本超时执行失败

一种办法是修改sshd的配置文件
另外一种办法是修改expect的超时计时器时间

7.4.3 在EOF段里面最后一条命令不会执行

原文地址:http://blog.51cto.com/355665/2071218

时间: 2024-08-02 06:07:34

Day04 字符串截取&字符串初值&数组&字符串替换的相关文章

istringstream字符串流,实现类似字符串截取的功能,字符串流中的put,str()将流转换成为字符串string

 1. istringstream字符串流 #include <iostream> #include <sstream> #include <string> using namespace std; struct MyStruct { string str1, str2, str3; double db; int num; char ch; }; void main() { string  mystring("china  google microsoft

PHP:字符串转数组,数组转字符串;字符串截取、替换、查找

字符串转数组$str = 'one|two|three|four'; print_r(explode('|', $str)); //explode 以字符串分割字符串到数组 $str = 'one two three'; //str_split 以位数分割 $arr1 = str_split($str); $arr2 = str_split($str, 3); print_r($arr1); print_r($arr2); 打印如下:Array ( [0] => o [1] => n [2]

【freemaker】之文本,html文本,去除空格,字母大小写,循环数组,字符串截取,map取值,遍历map

测试代码 @Test public void test06(){ try { root.put("emp", "<span color='red'>你好张三</span>"); freemakerUtil.print(root, "06.ftl"); freemakerUtil.fprint(root, "06.ftl", fn+"06.html"); } catch (Except

1字符串中的world替换为i bookan wisdom2.字符串的相加字符串输出,长度3比较字符串大小4截取字符串5字符串内所有a都替换成A6判断字符串是否以http开头7将字符串内admin和123截取出来8字符添加

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { /* 第1题 字符串中的world替换为i bookan wisdom */ //        NSString *[email protected]"hello world and sunshine"; //        NSString *newstr3=[str1 string

js字符串截取为数组

var str="hello,word,java,eclipse,jsp"; //字符串截取为数组 var strArr=str.split(","); for(j = 0,len=strArr.length; j < len; j++) { alert(strArr[j]); }; 原文地址:https://www.cnblogs.com/cppdy/p/9886538.html

js 字符串 常用处理方式(检索、截取、拼接、批量替换)

// 检索(字符串中判断是否包含某个字符) 字符串.search('检索的内容');// 返回-1,不包含: 返回非-1,包含 字符串.indexOf("待判断的内容"); // 截取 字符串.substr(起始位置,长度); 字符串.substring(起始位置,长度); 示例: var a = "as far as i known, xxx is handsome"; b = a.substr(19,a.length-1); // xxx is handsome

【转】BAT批处理中的字符串处理详解(字符串截取)

下面对这些功能一一进行讲解. 1.截取字符串 截取字符串可以说是字符串处理功能中最常用的一个子功能了,能够实现截取字符串中的特定位置的一个或多个字符.举例说明其基本功能: @echo off set ifo=abcdefghijklmnopqrstuvwxyz0123456789 echo 原字符串(第二行为各字符的序号): echo %ifo% echo 123456789012345678901234567890123456 echo 截取前5个字符: echo %ifo:~0,5% ech

Javascripty(数组字符串篇)

在数组中,元素之间用逗号隔开,数组的下标从0开始. length用来测试数组的长度,typeof 检测是哪种数据类型. 声明数组的方式: var arr=[1,2,3]; var arr1=new Array(); 数组的方法有: 1 push() 尾部添加元素 2 pop() 尾部删除 3 unshift() 头部添加 4 shift() 头部删除 5 join() 用于指定分隔符 6 reverse() 用于颠倒数组顺序 7 sort() 用于数组排序 8 concat() 用与数组与数组的

数组 字符串 常用操作

数组 常用操作 /*数组的属性*/ var arr=[1,3,34,45,44,88]; document.write(arr.constructor+"<br/>"); document.write(arr.length+"<br/>"); /*数组的方法*/ var arr2=["a","b","c","d"]; document.write(arr.conc