shell

shell.3.0 bash脚本编程:bash内置的字符串处理工具

 

目录:
=================

1.1 字符串切片(取字符串的子串)
1.2 基于模式取字符串
1.3 查找替换
1.4 查找删除
1.5 字符大小写转换
1.6 变量赋值

正文:
===========================

1.1  字符串切片(取字符串的子串):
${VALUE:offset:number}

offset:偏移量,表示从第一个字符开始计算,要跳过多少个字符;
number:表示要取出多少个字符;省略’number’,则表示偏移量之后的所有字符;

${VALUE:   -length}
冒号’:’与’-length’之间有空格;表示从元素(字符串)的最右侧开始往左取几个字符;

举例:

[root@KOU abc]# 
[root@KOU abc]# word=chineses
[root@KOU abc]# 
[root@KOU abc]# echo ${word:2:2}
in
[root@KOU abc]# echo ${word:2}
ineses
[root@KOU abc]# echo ${word: -4}
eses
[root@KOU abc]#

1.2  基于模式取字符串(删除操作)

${ARRAY_NAME#*word} :
‘word’表示任意长度的任意字符,此处作用是做为指定的分隔符;自左而右,查找’ARRAY_NAME’变量所存储的字符串中,第一次出现的’word’分隔符,删除字符串开头至此分隔符之间的所有字符

${ARRAY_NAME##*word} :
‘word’表示任意长度的任意字符,此处作用是做为指定的分隔符;自左而右,查找’ARRAY_NAME’变量所存储的字符串中,最后一次出现的’word’分隔符,删除字符串开头至此分隔符之间的所有字符

${ARRAY_NAME%word*} :
‘word’表示任意长度的任意字符,此处作用是做为指定的分隔符;自右而左,查找’ARRAY_NAME’变量所存储的字符串中,第一次出现的’word’分隔符,删除此分隔符至字符串尾部的所有字符

${ARRAY_NAME%%word*} :
‘word’表示任意长度的任意字符,此处作用是做为指定的分隔符;自右而左,查找’ARRAY_NAME’变量所存储的字符串中,最后一次出现的’word’分隔符,删除此分隔符至字符串尾部的所有字符

举例:

[root@KOU abc]# 
[root@KOU abc]# testpath="/etc/sysconfig/network-scripts/ifcfg-ens33"
[root@KOU abc]# 
[root@KOU abc]# echo ${testpath#*/}
etc/sysconfig/network-scripts/ifcfg-ens33
[root@KOU abc]# 
[root@KOU abc]# echo ${testpath##*/}
ifcfg-ens33
[root@KOU abc]# 
[root@KOU abc]# echo ${testpath%/*}
/etc/sysconfig/network-scripts
[root@KOU abc]# 
[root@KOU abc]# echo ${testpath%%/*}

[root@KOU abc]# 

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

[root@KOU abc]# 
[root@KOU abc]# url_name=https://www.google.com:8080
[root@KOU abc]# 
[root@KOU abc]# echo ${url_name##*:}
8080
[root@KOU abc]# 
[root@KOU abc]# echo ${url_name%%:*}
https
[root@KOU abc]#

 

1.3 查找替换

${ARRAY_NAME/PATTERN/SUBSTI}
查找’ARRAY_NAME’变量中所存储的字符串中,第一次被”PATTERN”模式匹配到的字符串,将其替换为”SUBSTI”所表示的字符串;

${ARRAY_NAME//PATTERN/SUBSTI}
查找’ARRAY_NAME’变量中所存储的字符串中,所有被”PATTERN”模式匹配到的字符串,将其全部替换为”SUBSTI”所表示的字符串;

[root@KOU abc]# 
[root@KOU abc]# url_name=https://www.google.com:8080
[root@KOU abc]# 
[root@KOU abc]# echo ${url_name/:/@}
https@//www.google.com:8080
[root@KOU abc]# 
[root@KOU abc]# echo ${url_name//:/@}
https@//www.google.com@8080
[root@KOU abc]#

${ARRAY_NAME/#PATTERN/SUBSTI}
查找’ARRAY_NAME’变量中所存储的字符串中,行首被”PATTERN”模式匹配到的字符串,将其替换为”SUBSTI”所表示的字符串;

${ARRAY_NAME/%PATTERN/SUBSTI}
查找’ARRAY_NAME’变量中所存储的字符串中,行尾被”PATTERN”模式匹配到的字符串,将其替换为”SUBSTI”所表示的字符串;

 

1.4 查找删除

${ARRAY_NAME/PATTERN}
查找’ARRAY_NAME’变量中所存储的字符串中,第一次被”PATTERN”模式匹配到的字符串,将其删除;

${ARRAY_NAME//PATTERN}
查找’ARRAY_NAME’变量中所存储的字符串中,所有被”PATTERN”模式匹配到的字符串,将其删除;

${ARRAY_NAME/#PATTERN}
查找’ARRAY_NAME’变量中所存储的字符串中,行首被”PATTERN”模式匹配到的字符串,将其删除;

${ARRAY_NAME/%PATTERN}
查找’ARRAY_NAME’变量中所存储的字符串中,行尾被”PATTERN”模式匹配到的字符串,将其删除;

备注:查找替换、查找删除,”PATTERN”使用glob风格的通配符;

1.5 字符大小写转换

${ARRAY_NAME^^}                       把”ARRAY_NAME”变量中存储的字符串中,所有小写字母转换为大写;
${ARRAY_NAME,,}                          把”ARRAY_NAME”变量中存储的字符串中,所有大写字母转换为小写;

1.6 变量赋值

${ARRAY_NAME:-VALUE}      如果”ARRAY_NAME”变量的值为空,或未设置,则返回”VALUE”;否则,返回”ARRAY_NAME”变量的值;
${ARRAY_NAME:=VALUE}     如果”ARRAY_NAME”变量的值为空,或未设置,则返回”VALUE”,并将”VALUE”赋值给”ARRAY_NAME”变量;否则,返回”ARRAY_NAME”变量的值;
${ARRAY_NAME:+VALUE}     如果”ARRAY_NAME”变量的值为不空,则返回”VALUE”;
${ARRAY_NAME:?ERROR_INFO}     如果”ARRAY_NAME”变量的值为空,或未设置,则返回”ERROR_INFO”为错误信息提示;否则,返回”ARRAY_NAME”变量的值;

[root@KOU abc]# 
[root@KOU abc]# echo $name

[root@KOU abc]# 
[root@KOU abc]# echo ${name:-kou}
kou
[root@KOU abc]# name=tom
[root@KOU abc]# 
[root@KOU abc]# echo ${name:-kou}
tom
[root@KOU abc]# 
-----------------------------------------------
[root@KOU abc]# 
[root@KOU abc]# echo $name
tom
[root@KOU abc]# 
[root@KOU abc]# unset name
[root@KOU abc]# 
[root@KOU abc]# echo ${name:=kobayashi}
kobayashi
[root@KOU abc]# 
[root@KOU abc]# echo $name
kobayashi
[root@KOU abc]# 
[root@KOU abc]# echo ${name:=kou}
kobayashi
---------------------------------------------------
[root@KOU abc]# echo $name
kobayashi
[root@KOU abc]# 
[root@KOU abc]# echo ${name:+kkk}
kkk
[root@KOU abc]# echo $name
kobayashi
[root@KOU abc]# 
---------------------------------------------------
[root@KOU abc]# unset name
[root@KOU abc]# 
[root@KOU abc]# echo $name

[root@KOU abc]# 
[root@KOU abc]# echo ${name?k3}
-bash: name: k3
[root@KOU abc]# 
[root@KOU abc]# name=kobayashi
[root@KOU abc]# 
[root@KOU abc]# echo ${name?k3}
kobayashi
[root@KOU abc]#

 

*********************************************************************

脚本示例:

写一个脚本,完成以下功能:
1> 提示用户输入一个可执行命令的名称;
2> 获取此命令所依赖的所有库文件列表;
3> 复制命令值某目录目录(例如,/mnt/sysroot,把此目录当做根目录)下的对应路径中;
      比如,/bin/bash –> /mnt/sysroot/bin/bash;
4> 复制此命令依赖的到的所有库文件至目标目录下的对应路径中;
5> 每次复制完成一个命令后,不要退出,而是提示用户继续输入要复制的其他命令,并重复完成如上所描述的功能;直到用户输入”quit”,则退出脚本;

#!/bin/bash
#


target_dir=/tmp/testpath1
if [ -d $target_dir ]; then
  echo "$target_dir is already exist."
else
   mkdir $target_dir && echo "$target is created."
fi


com_lib_cp() {
    for lib in $(ldd $1 | grep -o "/lib[^[:space:]]*"); do
      lib_dir=$(dirname $lib)
      [ -d $target_dir$lib_dir ] && echo "$target_dir$lib_dir is already exist." || mkdir $target_dir$lib_dir && echo "$target_dir$lib_dir has been created."
      [ -f $target_dir$lib ] && echo "$target_dir$lib is already exist." || cp $lib $target_dir$lib_dir && echo "$target_dir$lib has been copied."
    done
}



while true; do
  read -p "Usage : $0 enter a COMMAND or quit : " Command

  if [ "$Command" == "quit" ]; then
    echo "quit this script."
    break
  elif [ -z "$Command" ]; then
    continue
  elif ! which $Command &> /dev/null; then	
    continue
  else

    command_path=$(which --skip-alias $Command)
    command_dir=$(dirname $command_path)


    [ -d $target_dir$command_dir ] && echo "$target_dir$command_dir is already exist." || mkdir -p $target_dir$command_dir && echo "$target_dir$command_dir has been created."
    [ -f $target_dir$command_path ] && echo "$target_dir$command_path is already exist." || cp $command_path $target_dir$command_dir && echo "$target_dir$command_path has been cpyied."

    
    com_lib_cp $command_path	
  fi
done

 

Leave a Reply

Your email address will not be published. Required fields are marked *