目录:
=================
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