shell中变量替换与/或扩展(二)

2、变量替换与/或扩展
1)变量长度/子串提取
KaTeX parse error: Expected '}', got '#' at position 2: {#̲var} 字符串长度(即变量var的字符个数)。对于数组来说,${#array}是数组的第一个元素的升序.
例外情况:
KaTeX parse error: Expected '}', got '#' at position 2: {#̲*}和{#@} 表示位置参数的个数.
对于一个数组来说,KaTeX parse error: Expected '}', got '#' at position 2: {#̲array[*]}和{#array[@]}表示数组中元素的个数.


#!/bin/bash
# length.sh 变量值长度

E_NO_ARGS=65

if [ $# -eq 0 ] # 必须要有命令行参数给这个演示程序
then
        echo "Please invoke this script with one or more command-line arguments."
        exit $E_NO_ARGS
fi

var01=abcdEFGH28ij
echo "var01 = ${var01}"
echo "Length of var01 = ${#var01}"

# 现在,让我们在变量值内嵌入一个空格.

var02="abcd EFGH28ij"
echo "var02 = ${var02}"
echo "Length of var02 = ${#var02}"

echo "Number of command-line arguments passed to script = ${#@}"
echo "Number of command-line arguments passed to script = ${#*}"

exit 0

shell中变量替换与/或扩展(二)_第1张图片2)${var#Pattern}, KaTeX parse error: Expected '}', got '#' at position 5: {var#̲#Pattern} 删除从var前端开始的最短或最长匹配$Pattern的字符串。

#!/bin/bash
# pattern.sh

strip_leading_zero() # 剥去传递的参数中可能存在的前导0,即删除前面的0
{
        echo ${1#0} # "1"表示变量"$1" == 传给函数的参数
}                       # 而"0"表示要从"$1"前端剥掉的字符 -- 剥掉0

strip_leading_zero2()           # 剥除前导的0字符,因为不这样
{                               # Bash会把这串字符当成八进制值
        shopt -s extglob        # 激活扩展匹配.
        local val=${1##+(0)}    # 使用局部变量,匹配最长的0.
        echo "val = $val"
        shopt -u extglob        # 禁用扩展匹配.
        _strip_leading_zero2=${val:-0}
                                # 如果输入是0,返回0来替换返回"".
}

echo "input argument is 00120310"
strip_leading_zero "00120310"

strip_leading_zero2 "00120310"
result2=$_strip_leading_zero2
echo "Result 2: $result2"

echo "Current working directory base name:"
echo `basename $PWD`            # 当前工作目录的基本名字
echo "${PWD##*/}"               # 当前工作目录的基本名字
echo
echo `basename $0`              # 脚本名
echo $0                         # 脚本名
echo "${0##*/}"                 # 脚本名
echo
filename=test.data
echo "${filename##*.}"          # data
                                # 文件的扩展名

shell中变量替换与/或扩展(二)_第2张图片
3)${var%Pattern}, KaTeX parse error: Expected '}', got 'EOF' at end of input: …r%%Pattern} 删除从var前端开始的最短或最长匹配$Pattern的字符串。

#!/bin/bash
# pattern-matching.sh

# 使用# ## % %%的参数替换操作的模式匹配.

var1=abcd12345abc6789abc
pattern1=a*c # * (星号)匹配a - c的所有字符

echo
echo "var1 = $var1"     # abcd12345abc6789abc
echo "var1 = ${var1}"   # abcd12345abc6789abc
                        # (另一种形式)
echo "Number of characters in ${var1} = ${#var1}"
echo

echo "pattern1 = $pattern1"     # a*c   (此表达式匹配'a'与'c'之间的所
有字符)
echo "-----------------------"
echo '${var1#$pattern1} =' "${var1#$pattern1}"  # d12345abc6789abc
echo '${var1%$pattern1} =' "${var1%$pattern1}"  # abcd12345abc6789
# 匹配开头的最短字串    abcd12345abcba6789abc

echo '${var1##$pattern1} =' "${var1##$pattern1}" # 输出空
echo '${var1%%$pattern1} =' "${var1%%$pattern1}" # 输出空
# 最长匹配,剥掉开头的12个字符

echo;echo;echo

var2=abcd12345abc6789
pattern2=b*9            # 匹配'b'和'9'之间的所有字符
echo "var2 = $var2"     # 仍然是 abcd12345abc6789
echo
echo "pattern2 = $pattern2"
echo "-------------------------"
echo '${var2%pattern2} =' "${var2%$pattern2}"   # abcd12345a
# 最短匹配,剥去后面的6个字符   abcd12345abc6789

echo '${var2%%pattern2} =' "${var2%%$pattern2}" # a

# 记住,#和##表示在字符串的左边(即开头)操作,
#       	%和%%表示在字符串的右边(即结尾)操作.

echo

exit 0

shell中变量替换与/或扩展(二)_第3张图片

#!/bin/bash
# rfe.sh:更改文件扩展名

# rfe old_extension new_extension

# 例如:
# T为了把当前目录下所有的*.gif文件改成*.jpg,如下执行:
#       rfe gif jpg

E_BADARGS=65

case $# in
        0|1)    # 在这里,竖线(|)意味着"或"。
        echo "Usage: `basename $0` old_file_suffix new_file_suffix"
        exit $E_BADARGS # 如果是0或1,就退出脚本
        ;;
esac

for filename in *.$1
# 把文件名以第一个参数为后缀的文件全部列举出来
do
        mv $filename ${filename%$1}$2
        #  剥去文件名中匹配第一个参数的部分,
        #+ 然后加上第二个参数.
done

exit 0

你可能感兴趣的:(学习,linux,运维,服务器,centos)