SHELL脚本之字符串大截取取与切割

SHELL脚本之字符串大截取取与切割,第1张

本问主要解决以下三个问题:

第一问、什么是字符串的截取与切割以及它的作用是什么?

第二问、字符串截取大方法有哪些?

第三问、字符串截取与切割大实际应用场景有哪些?

第一问:什么是字符串的截取与切割以及它的作用是什么?

字符串的截取与切割指的是:将一串数字、文字、字母以及各种标点和特殊的符号按你的需要进行过滤和筛选;

例如:请在李白的这首《行路难》中找出第15个字是什么?如果我们肉眼的话,就得挨个数了;

                            《行路难》

        金樽清酒斗十千⑴,玉盘珍羞直万钱⑵。

 停杯投箸不能食⑶,拔剑四顾心茫然。

 欲渡黄河冰塞川,将登太行雪满山。

 闲来垂钓碧溪上,忽复乘舟梦日边⑷。

 行路难!行路难!多岐路,今安在⑸?

 长风破浪会有时⑹,直挂云帆济沧海

这只是一首短诗,如果要在1万字中寻找一第67898个字,你肿么办?也一个一个的数吗?

这个时候,如果你知道字符串的截取与切割那就非常简单了,几秒钟就搞定了。

如何搞定从10万字中只取第67898个字?

请看,字符串截取大方法有哪些?

第二问、字符串截取大方法有哪些?

字符串截取的方法有三种,分别是:

1、${变量名:起始位置:长度};

2、expr  substr  "$变量名"  起始位置  长度 ;

3、echo   $变量名  |  cut  -b   起始位置-结束位置

用这三种方法都可以实现快速的从10万个字中寻找到第67898个字;

假如这10万字在一个名叫luotxt的文本文件中;

定义变量:look=$(cat  /luotxt)

第一种方法:echo   ${look:67897:1}

译为:从变量 look 中截取第67898个字符,字符长度为1个;

注:采取${}这种方法截取字符,起始位置是从0开始算起,所以截取第67898个字符,我填写的是67897;

第二种方法:expr   substr   "$look"    67898  1 

译为:采取 expr substr  字符串截取的方法,截取变量look中的第67898位置的字符,长度为1;

第三种方法:echo   $look  |    cut  -b  67898

译为:运用 echo  $变量名  |  cut  -b  起始位置-结束位置的方法截取变量look中起始位置是67898,结束位置也是67898的字符;

第三问、字符串截取与切割大实际应用场景有哪些?

应用场景有以下但不限于:

场景1:为新建的用户设置随机密码;

场景2:信用卡用户,新卡下来的随机密码;

场景3:在茫茫字符串中寻找你想要的任意字符;

以场景1为例编写用户随机密码的脚本:

假如你是公司的运维工程师,现在你公司有100个新同事刚刚入职,需要你为他们创建新的账户和密码,请问你会怎么做?

具体做法如下:

第一步、问人事部拿到新同事入职名单usertxt;

第二步、编写一个创建用户和设置密码的脚本;

vim   /xinsh        ##译为:运用vim文本编辑器创建一个名叫xinsh的文本文件;

 #!/bin/bahs        ##译为:shell脚本固定格式;

pass=""                ##译为:将pass这个变量定义为空值;

x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890

##译为:讲x这个变量定义为abcdefghij

for  i  in `cat  /usertxt`        ##译为:将 i 这个变量 cat  /usertxt,然后循环执行下面的指令;

do

useradd  $i            ##译为:创建变量中 $i 的用户;

echo  "用户 $i 创建成功"    ##译为:运用 echo 输出创建 $i 的信息;

echo $i >> /luo1txt        ##译为:将 $i 的信息输出并追加重定向到 luotxt 这个文本文件中;

for  q  in  {16}        ##译为:循环中嵌套的子循环,循环执行下面的命令6次;

do

n=$[RANDOM%62]        ##译为:为变量名 n 赋值为1-62之间;

m=${x:n:1}                      ##译为:将变量名 m 赋值为 $(x:n:1);

pass=${pass}$m            ##译为:将变量名 pass 赋值为 ${pass}$m

done                              ##译为:结束循环的固定格式;

echo  $pass  |  password  --stdin  $i  &>  /dev/null    ##译为:将 $i 的用户的密码设置为 $pass,并把结果输在屏幕上的结果,不管是正确还是错误,全部丢掉;

echo  "用户 $i 的密码设置成功"  ##译为:运用 echo 命令输出 $i 创建密码的信息;

echo $pass >> /luo1txt ##译为:将 $pass 的信息输出并追加重定向到 luotxt 这个>文本文件中;

pass=""                          ##译为:将变量pass重新定义为空值,便于上面命令重新赋值;

done                             ##译为:for循环固定的结束格式;

以上

(本篇完)

祝:顺利!

罗贵

2019-0310于深圳

上一篇文章中,介绍了shell的相互引用,这是普遍的做法。

经常使用shell终端的,可以创建自己的shell库,保存一些常用命令。

用自动导入函数的方法,可以在命令行下像执行命令一样快捷,而且速度快,占用资源少

1,建立自己的函数库

mkdir functionlib

然后将常用的脚本改成函数的语法,如:

function filename { command ; }

将filename拷贝到functionlib中,

2,修改环境文件,在/etc/profile中添加

export FPATH=$HOME/functionlib

3,重登录一下

这样的话,你就可以随时用像ls那样运行你自己的filename"命令"

而不需要用什么dot,sh,来运行你的函数/脚本啦~~

如果在脚本中运行,可以在脚本顶部用

#!/bin/sh

##

autoload filename//来自动导入函数

filename // 调用函数

关于shell中的for循环用法很多,一直想总结一下,今天网上看到上一篇关于for循环用法的总

结,感觉很全面,所以就转过来研究研究,嘿嘿

1、 for((i=1;i<=10;i++));do echo $(expr $i \ 4);done

2、在shell中常用的是 for i in $(seq 10)

3、for i in `ls`

4、for i in ${arr[@]}

5、for i in $ ; do

6、for File in /proc/sys/net/ipv4/conf//accept_redirects; do

7、for i in f1 f2 f3 ;do

8、for i in txt

9、for i in $(ls txt)

for in语句与` `和$( )合用,利用` `或$( )的将多行合为一行的缺陷,实际是合为一个字符串

数组

============ -_- ==============for num in $(seq 1 100)

10、LIST="rootfs usr data data2"

for d in $LIST; do

用for in语句自动对字符串按空格遍历的特性,对多个目录遍历

11、for i in {110}

12、for i in stringchar {110}

13、awk 'BEGIN{for(i=1; i<=10; i++) print i}'

注意:AWK中的for循环写法和C语言一样的

===============================================================

01#/bin/bash

02# author: 周海汉

03# date :2010325

04# blogcsdnnet/ablo_zhou

05arr=("a" "b" "c")

06echo "arr is (${arr[@]})"

07echo "item in array:"

08for i in ${arr[@]}

09do

10 echo "$i"

11done

12echo "参数,\$表示脚本输入的所有参数:"

13for i in $ ; do

14echo $i

15done

16echo

17echo '处理文件 /proc/sys/net/ipv4/conf//accept_redirects:'

18for File in /proc/sys/net/ipv4/conf//accept_redirects; do

19echo $File

20done

21echo "直接指定循环内容"

22for i in f1 f2 f3 ;do

23echo $i

24done

25echo

26echo "C 语法for 循环:"

27for (( i=0; i<10; i++)); do

28echo $i

29done

-----------------------------------------------------------------------------------

----------------------

shell中for循环用法

shell语法好麻烦的,一个循环都弄了一会 ,找了几个不同的方法来实现输出1-100间可以被3

整除的数

1用(())

#!/bin/bash

clear

for((i=1;i<100;i++))

for

do

if((i%3==0))

then

echo $i

continue

fi

done

2使用`seq 100`

#!/bin/bash

clear

for i in `seq 100`

do

if((i%3==0))

then

echo $i

continue

fi

done

3使用while

#!/bin/bash

clear

i=1

while(($i<100))

do

if(($i%3==0))

then

echo $i

fi

i=$(($i+1))

done

-----------------------------------------------------------------------------------

---------------------

在shell用for循环做数字递增的时候发现问题,特列出shell下for循环的几种方法:

1

for i in `seq 1 1000000`;do

echo $i

done

用seq 1 10000000做递增,之前用这种方法的时候没遇到问题,因为之前的i根本就没用到百万

(1000000),因为项目需要我这个数字远大于百万,发现用seq 数值到 1000000时转换为1e+06,根

本无法作为数字进行其他运算,或者将$i有效、正确的取用,遂求其他方法解决,如下

2

for((i=1;i<10000000;i++));do

echo $i

done

3

i=1

while(($i<10000000));do

echo $i

i=`expr $i + 1`

done

因为本方法调用expr故运行速度会比第1,第2种慢不少不过可稍作改进,将i=`expr $i + 1`改

为i=$(($i+1))即可稍作速度的提升,不过具体得看相应shell环境是否支持

4

for i in {110000000;do

echo $i

done

其实选用哪种方法具体还是得由相应的shell环境的支持,达到预期的效果,再考虑速度方面的

问题。

最近在学一段脚本中的if语句中出现了这么一句:

 if [ ! -f "/usr/bin/svnserve" ]

一时没想起这个-f的意思,于是重新翻了之前的笔记,把相关的知识点总结如下:

-e filename 如果 filename存在,则为真

-d filename 如果 filename为目录,则为真 

-f filename 如果 filename为常规文件,则为真

-L filename 如果 filename为符号链接,则为真

-r filename 如果 filename可读,则为真 

-w filename 如果 filename可写,则为真 

-x filename 如果 filename可执行,则为真

-s filename 如果文件长度不为0,则为真

-h filename 如果文件是软链接,则为真

filename1 -nt filename2 如果 filename1比 filename2新,则为真。

filename1 -ot filename2 如果 filename1比 filename2旧,则为真。

-eq 等于

-ne 不等于

-gt 大于

-ge 大于等于

-lt 小于

-le 小于等于

04 字符串变量表达式

if [ $a = $b ]                 如果string1等于string2,则为真,字符串允许使用赋值号做等号

if  [ $string1 !=  $string2 ]   如果string1不等于string2,则为真       

if  [ -n $string  ]             如果string 非空(非0),返回0(true)  

if  [ -z $string  ]             如果string 为空,则为真

if  [ $sting ]                  如果string 非空,返回0 (和-n类似) 

    逻辑非 !                   条件表达式的相反

if [ ! 表达式 ]

if [ ! -d $num ]               如果不存在目录$num

    逻辑与 –a                   条件表达式的并列

if [ 表达式1  –a  表达式2 ]

    逻辑或 -o                   条件表达式的或

if [ 表达式1  –o 表达式2 ]

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/langman/3503998.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-15
下一篇2023-08-15

发表评论

登录后才能评论

评论列表(0条)

    保存