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