Linux—shell$( )与``;字符串的分割,替换,截取

参考链接:

  1. https://blog.csdn.net/number_0_0/article/details/73291182
  2. https://blog.csdn.net/u013402321/article/details/80333272

$()和``
他们是一样的使用效果,用来作命令替换的.建议使用$()

[kafka@kafka001 kafka_2.11-0.8.2.2]$ echo $(ls)
bin config libs LICENSE log logs NOTICE
[kafka@kafka001 kafka_2.11-0.8.2.2]$ ls
bin  config  libs  LICENSE  log  logs  NOTICE
[kafka@kafka001 kafka_2.11-0.8.2.2]$ `ls`
-bash: bin: command not found
[kafka@kafka001 kafka_2.11-0.8.2.2]$ echo `ls`
bin config libs LICENSE log logs NOTICE
[kafka@kafka001 kafka_2.11-0.8.2.2]$ 


${}用于变量替换, v a r 和 var和 var{var}意思一样,不过${var}更精确的表明变量名。有利于拼接

[dps@ccod131 bak]$ a=123 && echo $ab

[dps@ccod131 bak]$ a=123 && echo ${a}b
123b

#%*

[dps@ccod131 bak]$ file=file1/file2/file3/file.txt && echo ${file##/}
file1/file2/file3/file.txt

# 实际有效的写法
[dps@ccod131 bak]$ file=file1/file2/file3/file.txt && echo ${file##*/}
file.txt
[dps@ccod131 bak]$ file=file1/file2/file3/file.txt && echo ${file##/*}
file1/file2/file3/file.txt

[dps@ccod131 bak]$ file=file1/file2/file3/file.txt && echo ${file%%/}
file1/file2/file3/file.txt

#实际有效的写法
[dps@ccod131 bak]$ file=file1/file2/file3/file.txt && echo ${file%%/*}
file1
[dps@ccod131 bak]$ file=file1/file2/file3/file.txt && echo ${file%%*/}
file1/file2/file3/file.txt

从以上例子可以看出:

  • 上边例子中,分隔符为/
  1. #从左边开始数,到达分割符后,将整个字段分割成两份;(#在键盘的左边,左)
  2. %从右边开始数,到达分割符后,将整个字段分割成两份;(%在键盘的右边,右)
  3. *将走过的地方全匹配,并删除;(故#中,其在分隔符的左边有有效;%中,其在分隔符的右边生效)
  4. 对于#,%单一字符是最小匹配,两个字符是最大匹配(#表示从左边第一个分隔符开始分割,##表示从左边数的最后一个分隔符开始分割;%表示从右边第一个分隔符开始分割,%%表示从右边数的最后一个分隔符开始分割;)

实际使用:
去除文件相同的后缀

#查看符合条件的文件
dps@ccod131 bak]$ ls *.txt
aa.txt  awk.txt  bb.txt  eof.txt  err.txt  file.txt  test11.txt

#批量给这些文件添加后缀
[dps@ccod131 bak]$ ls *.txt | xargs -i mv {
    
    } {
    
    }.bak
[dps@ccod131 bak]$ ls *.bak
aa.txt.bak  awk.txt.bak  bb.txt.bak  eof.txt.bak  err.txt.bak  file.txt.bak  test11.txt.bak

#批量去除后缀的执行效果
[dps@ccod131 bak]$ bash for_string.sh 
aa.txt awk.txt bb.txt eof.txt err.txt file.txt test11.txt

#批量去除后缀的代码
[dps@ccod131 bak]$ cat for_string.sh 
#!/bin/bash 

for file in $(ls *.bak)
  do
    mv $file ${file%.*}
  done
echo $(ls *.txt*)


${string:position:length}

  • 表示从位置position开始向右截取字符串,截取长度为length;
  • 当length为空时,即${string:position}这种形式时,表示从position截取字符串,一直到结束
  • 当position等于0-1时,表示从倒数第一个字符开始截取字符串;
[dps@ccod131 bak]$ 
[dps@ccod131 bak]$ abc=1234567890 && echo ${abc:0:3}
123
[dps@ccod131 bak]$ abc=1234567890 && echo ${abc:3:3}
456
[dps@ccod131 bak]$ abc=1234567890 && echo ${abc:0-3:3}
890
[dps@ccod131 bak]$ abc=1234567890 && echo ${abc:0-9:3}
234
[dps@ccod131 bak]$ abc=1234567890 && echo ${abc:5}
67890


${#var}获取变量长度

[dps@ccod131 bak]$ abc=1234567890 && echo ${#abc}
10


替换

命令 说明
${string/substring/replacement} 使用 r e p l a c e m e n t , 来 代 替 第 一 个 匹 配 的 replacement, 来代替第一个匹配的 replacement,substring
${string//substring/replacement} 使用 r e p l a c e m e n t , 代 替 所 有 匹 配 的 replacement, 代替所有匹配的 replacement,substring
${string/#substring/replacement} 如果 s t r i n g 的 前 缀 匹 配 string的前缀匹配 stringsubstring, 那么就用 r e p l a c e m e n t 来 代 替 匹 配 到 的 replacement来代替匹配到的 replacementsubstring
${string/%substring/replacement} 如果 s t r i n g 的 后 缀 匹 配 string的后缀匹配 stringsubstring, 那么就用 r e p l a c e m e n t 来 代 替 匹 配 到 的 replacement来代替匹配到的 replacementsubstring
dps@ccod131 bak]$ var=abc1abc2abc3 && echo ${var/abc/ABC}
ABC1abc2abc3
[dps@ccod131 bak]$ var=abc1abc2abc3 && echo ${var//abc/ABC}
ABC1ABC2ABC3
[dps@ccod131 bak]$ var=abc1abc2abc3 && echo ${var/#abc/ABC}
ABC1abc2abc3
[dps@ccod131 bak]$ var=abc1abc2abc3 && echo ${var/%abc/ABC}
abc1abc2abc3
[dps@ccod131 bak]$ var=abc1abc2abc3 && echo ${var/%abc3/ABC}
abc1abc2ABC


shift

  • 将命令参数左移,默认1位。可加参数
  • 多应用于启动脚本中;

参考链接: https://blog.csdn.net/sdustliyang/article/details/9731277

[dps@ccod131 bak]$ cat shift.sh 
#!/bin/bash 

until [ $# -eq 0 ]
do
echo "当前第一的参数值${1},参数总数$#"
shift
done
[dps@ccod131 bak]$ ./shift.sh 1 2 3 4 5 6
当前第一的参数值1,参数总数6
当前第一的参数值2,参数总数5
当前第一的参数值3,参数总数4
当前第一的参数值4,参数总数3
当前第一的参数值5,参数总数2
当前第一的参数值6,参数总数1


[dps@ccod131 bak]$ cat shift.sh 
#!/bin/bash 

until [ $# -eq 0 ]
do
echo "当前第一的参数值${1},参数总数$#"
shift 3
done
[dps@ccod131 bak]$ ./shift.sh 1 2 3 4 5 6
当前第一的参数值1,参数总数6
当前第一的参数值4,参数总数3

猜你喜欢

转载自blog.csdn.net/jjt_zaj/article/details/113056275