【Linux编程Shell自动化脚本】02 循环语句、选择语句与函数

文章目录

    • 一、循环语句
      • 1. for语句
        • 1.1 for in循环
          • (1)语法格式
          • (2)value_list 取值形式
        • 1.2 C风格for循环
        • 1.3 补充相关常用命令
          • (1)seq命令
          • (2)expr
            • 字符串表达式
            • 算术表达式
            • 逻辑关系表达式
            • 使用示例
          • (3)find
          • (4)scp 命令
          • (5)ssh -l
          • (6)cd -命令(返回上一次访问的目录中)
          • (7)ssh-copy-id命令
      • 2. while和until语句
        • 2.1 语法格式
        • 2.2 补充相关常用命令
          • (1)read命令
    • 二、选择语句
      • 1. case和select语句
    • 三、函数
    • 四、数组

一、循环语句

shell中的for、while和until语句都是Compound Commands

1. for语句

1.1 for in循环

for name [ [ in [ word … ] ] ; ] do list ; done

  • The list of words following in is expanded, generating a list of items. The variable name is set to each element of this list in turn, and list is executed each time. If the in word is omitted, the for command executes list once for each positional parameter that is set. The return status is the exit status of the last command that executes. If the expansion of the items following in results in an empty list, no commands are executed, and the return status is 0.

A positional parameter is a parameter denoted by one or more digits, other than the single digit 0. Positional parameters are assigned from the shell’s arguments when it is invoked, and may be reassigned using the set builtin command. Positional parameters may not be assigned to with assignment statements. The positional parameters are temporarily replaced when a shell function is executed

(1)语法格式
for variable in value_list
do
    statements
done

in value_list 部分可以省略,省略后的效果相当于将 variable 取值为positional parameter

(2)value_list 取值形式
  • 直接给出具体的值
    可以在 in 关键字后面直接给出具体的值,多个值之间以空格分隔,比如1 2 3 4 5、“abc” “390” "tom"等
for n in 1 2 3 4 5 6
do
    echo $n
done
for str in "abc" "390" "tom"
do
    echo $str
done

After word splitting, unless the -f option has been set, bash scans each word for the characters *, ?, and [. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern.

  • * : Matches any string, including the null string.
  • ? : Matches any single character.
  • […] : Matches any one of the enclosed characters.
for i in hello 1 * 2 goodbye 
do
  echo "Looping ... i is set to $i"
done

上述命令输出结果为:

Looping ... i is set to hello
Looping ... i is set to 1
Looping ... i is set to (name of first file in current directory)
    ... etc ...
Looping ... i is set to (name of last file in current directory)
Looping ... i is set to 2
Looping ... i is set to goodbye
  • 取值范围(Brace Expansion)

Brace expansion is a mechanism by which arbitrary strings may be generated. This mechanism is similar to pathname expansion, but the filenames generated need not exist. Patterns to be brace expanded take the form of an optional preamble, followed by either a series of comma-separated strings or a sequence expression between a pair of braces, followed by an optional postscript. The preamble is prefixed to each string contained within the braces, and the postscript is then appended to each resulting string, expanding left to right.
Brace expansions may be nested. The results of each expanded string are not sorted; left to right order is preserved. For example, a{d,c,b}e expands into ‘ade ace abe’.
A sequence expression takes the form {xy[…incr]}, where x and y are either integers or single characters, and incr, an optional increment, is an integer. When integers are supplied, the expression expands to each number between x and y, inclusive. Supplied integers may be prefixed with 0 to force each term to have the same width. When either x or y begins with a zero, the shell attempts to force all generated terms to contain the same number of digits, zero-padding where necessary. When characters are supplied, the expression expands to each character lexicographically between x and y, inclusive. Note that both x and y must be of the same type. When the increment is supplied, it is used as the difference between each term. The default increment is 1 or -1 as appropriate.

for n in {1..100}
do
    echo $n
done
for c in {A..z}
do
    echo $c
done
for c in a{d,c,b}e
do
    echo $c
done
  • 使用命令的执行结果
for filename in $(ls *.sh)
do
    echo $filename
done
for i in $(seq 1 10);
do
	echo $i;
done
  • 使用特殊变量
    Shell 中有多个特殊的变量,例如 $#、$*、$@、$?、$$ 等
function func(){
    for str in $@
    do
        echo $str
    done
}
func C++ Java Python C#

也可以省略 value_list,省略后 str 取值为 positional parameter

function func(){
    for str
    do
        echo $str
    done
}
func C++ Java Python C#

两段命令输出结果等价

1.2 C风格for循环

for (( expr1 ; expr2 ; expr3 )) ; do list ; done

  • First, the arithmetic expression expr1 is evaluated according to the rules described below under ARITHMETIC EVALUATION. The arithmetic expression expr2 is then evaluated repeatedly until it evaluates to zero. Each time expr2 evaluates to a non-zero value, list is executed and the arithmetic expression expr3 is evaluated. If any expression is omitted, it behaves as if it evaluates to 1. The return value is the exit status of the last command in list that is executed, or false if any of the expressions is invalid.

语法格式

for((exp1; exp2; exp3))
do
    statements
done

1.3 补充相关常用命令

(1)seq命令

print a sequence of numbers
语法格式:

  • seq LAST
  • seq FIRST LAST
  • seq FIRST INCREMENT LAST
(2)expr

expr命令可以实现数值运算、数值或字符串比较、字符串匹配、字符串提取、字符串长度计算等功能。它还具有几个特殊功能,判断变量或参数是否为整数、是否为空、是否为0等。

字符串表达式

'expr’支持模式匹配和字符串操作。字符串表达式的优先级高于数值表达式和逻辑关系表达式。

  • ‘STRING : REGEX’
    执行模式匹配。两端参数会转换为字符格式,且第二个参数被视为正则表达式,它默认会隐含前缀"^"。随后将第一个参数和正则模式做匹配。

    如果匹配成功,且REGEX使用了’(‘和’)‘,则此表达式返回匹配到的,如果未使用’(‘和’)',则返回匹配的字符数。

    如果匹配失败,如果REGEX中使用了’(‘和’)',则此表达式返回空字符串,否则返回为0。

    只有第一个’(…)‘会引用返回的值;其余的’(…)'只在正则表达式分组时有意义。

    在正则表达式中,‘+’,'?‘和’|'分表代表匹配一个或多个,0个或1个以及两端任选其一的意思。

  • ‘match STRING REGEX’
    等价于’STRING : REGEX’。

  • ‘substr STRING POSITION LENGTH’
    返回STRING字符串中从POSITION开始,长度最大为LENGTH的子串。如果POSITION或LENGTH为负数,0或非数值,则返回空字符串。

  • ‘index STRING CHARSET’
    CHARSET中任意单个字符在STRING中最前面的字符位置。如果在STRING中完全不存在CHARSET中的字符,则返回0。

  • ‘length STRING’
    返回STRING的字符长度。

  • ‘+ TOKEN’
    将TOKEN解析为普通字符串,即使TOKEN是像MATCH或操作符"/"一样的关键字。这使得’expr length + “$x”‘或’expr + “$x” : ‘./(.)'‘可以正常被测试,即使"$x"的值可能是’/‘或’index’关键字。这个操作符是一个GUN扩展。
    通用可移植版的应该使用’" $token" : ’ (.
    )’‘来代替’+ “$token”’。

    要让expr将关键字解析为普通的字符,必须使用引号包围。

算术表达式

'expr’支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。

  • ‘+ -’
    加减运算。两端参数会转换为整数,如果转换失败则报错。

  • ‘* / %’
    乘,除,取模运算。两端参数会转换为整数,如果转换失败则报错。

逻辑关系表达式

'expr’支持普通的逻辑连接和逻辑关系。它的优先级最低。

  • ‘|’
    如果第一个参数非空且非0,则返回第一个参数的值,否则返回第二个参数的值,但要求第二个参数的值也是非空或非0,否则返回0。如果第一个参数是非空或非0时,不会计算第二个参数。

    经过测试,以上手册内容是错误的。正确的应该是:如果第一个参数非0,则返回第一个参数的值,否则返回第二个参数。但如果任意一个参数为空,则报错。除非空字符串使用引号包围,此时将和0的处理方式一样。

  • ‘&’
    如果两个参数都非空且非0,则返回第一个参数,否则返回0。如果第一个参为0或为空,则不会计算第二个参数。

    经过测试,以上手册内容是错误的。正确的应该是:如果两个参数都非0,则返回第一个参数,否则返回0。但任意一个参数为空,则报错。除非空字符串使用引号包围,此时将和0的处理方式一样。

  • ‘< <= = == != >= >’
    比较两端的参数,如果为true,则返回1,否则返回0。"==“是”="的同义词。"expr"首先尝试将两端参数转换为整数,并做算术比较,如果转换失败,则按字符集排序规则做字符比较。

括号’()'可以改变优先级,但使用时需要使用反斜线对括号进行转义。

使用示例
  • 将shell中变量’foo’的值增加1
foo=$(expr $foo + 1)
  • 输出变量路径变量’$fname’中不包含’/'的文件名部分
expr $fname : '.*/\(.*\)' '|' $fname

解释:其中的’|‘是expr中的连接符,只不过是被引号包围防止被shell解析。例如$fname=/etc/hosts,则此表达式返回hosts,如果$fname=filename,则此表达式’|‘的左边为空,所以返回’|'右边的值,即$fname,即返回filename。

  • 其他示例
expr aaa : 'a\+'    # 解释:因为REGEX部分没有使用\(\),所以返回匹配的字符数
=> 3
expr abc : 'a\(.\)c'  # 解释:因为REGEX部分使用了\(\),所以返回匹配的字符
=> b
expr index abcdef cz
=> 3
expr index index a    # 解释:因为第二个index是关键字
error-> expr: syntax error
expr index + index a  # 解释:使用+将index关键字解析为普通字符串
=> 0
(3)find

语法格式

find [path] [expression]

参数说明 :

path 是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。

expression 是可选参数,用于指定查找的条件,可以是文件名、文件类型、文件大小等等。

以下列出最常用expression的部分:

  • -name pattern:按文件名查找,支持使用通配符 * 和 ?。
  • -type type:按文件类型查找,可以是 f(普通文件)、d(目录)、l(符号链接)等。
  • -size [+-]size[cwbkMG]:按文件大小查找,支持使用 + 或 - 表示大于或小于指定大小,单位可以是 c(字节)、w(字数)、b(块数)、k(KB)、M(MB)或 G(GB)。
  • -mtime days:按修改时间查找,支持使用 + 或 - 表示在指定天数前或后,days 是一个整数表示天数。
  • -user username:按文件所有者查找。
  • -group groupname:按文件所属组查找。

find 命令中用于时间的参数如下:

  • -amin n:查找在 n 分钟内被访问过的文件。
  • -atime n:查找在 n*24 小时内被访问过的文件。
  • -cmin n:查找在 n 分钟内状态发生变化的文件(例如权限)。
  • -ctime n:查找在 n*24 小时内状态发生变化的文件(例如权限)。
  • -mmin n:查找在 n 分钟内被修改过的文件。
  • -mtime n:查找在 n*24 小时内被修改过的文件。
    在这些参数中,n 可以是一个正数、负数或零。正数表示在指定的时间内修改或访问过的文件,负数表示在指定的时间之前修改或访问过的文件,零表示在当前时间点上修改或访问过的文件。

例如:-mtime 0 表示查找今天修改过的文件,-mtime -7 表示查找过去一周以内修改过的文件。

关于时间 n 参数的说明:

  • +n:查找比 n 天前更早的文件或目录。
  • -n:查找在 n 天内更改过属性的文件或目录。
  • n:查找在 第 n 天前(指定那一天)更改过属性的文件或目录。

其他选项参数

  • -maxdepth levels
    Descend at most levels (a non-negative integer) levels of directories below the starting-points. Using -maxdepth 0 means only apply the tests and actions to the starting-points themselves.
  • -mindepth levels
    Do not apply any tests or actions at levels less than levels (a non-negative integer). Using -mindepth 1 means process all files except the starting-points.
(4)scp 命令

scp在网络上的主机之间复制文件。它使用ssh进行数据传输,并使用相同的身份验证并提供与 ssh 相同的安全性。如果需要进行身份验证, scp将要求输入密码或密码。

语法格式

scp [可选参数] file_source file_target 

参数说明

  • -1: 强制scp命令使用协议ssh1
  • -2: 强制scp命令使用协议ssh2
  • -4: 强制scp命令只使用IPv4寻址
  • -6: 强制scp命令只使用IPv6寻址
  • -B: 使用批处理模式(传输过程中不询问传输口令或短语)
  • -C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
  • -p:保留原文件的修改时间,访问时间和访问权限。
  • -q: 不显示传输进度条。
  • -r: 递归复制整个目录。
  • -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
  • -c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
  • -F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
  • -i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
  • -l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
  • -o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,
  • -P port:注意是大写的P, port是指定数据传输用到的端口号
  • -S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

示例

  • 从本地复制到远程(复制文件)
scp local_file remote_username@remote_ip:remote_folder 
或者 
scp local_file remote_username@remote_ip:remote_file 
或者 
scp local_file remote_ip:remote_folder 
或者 
scp local_file remote_ip:remote_file 
  • 从本地复制到远程(复制文件夹)
scp -r local_folder remote_username@remote_ip:remote_folder 
或者 
scp -r local_folder remote_ip:remote_folder 
  • 从远程复制到本地:从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可
(5)ssh -l

-l login_name
Specifies the user to log in as on the remote machine. This also may be specified on a per-host basis in the configuration file.

(6)cd -命令(返回上一次访问的目录中)

cd -
When a is used as the operand, this shall be equivalent to the command:

cd "$OLDPWD" && pwd

which changes to the previous working directory and then writes its name.

(7)ssh-copy-id命令

语法格式

ssh-copy-id [-i [identity_file]] [user@]machine

该命令将 SSH 密钥复制到远程主机的authorized_keys文件中。如果给出-i选项,则使用身份文件(默认为~/.ssh/id_rsa.pub )

2. while和until语句

while list; do list; done
until list; do list; done

  • The while command continuously executes the do list as long as the last command in list returns an exit status of zero. The until command is identical to the while command, except that the test is negated; the do list is executed as long as the last command in list returns a non-zero exit status. The exit status of the while and until commands is the exit status of the last do list command executed, or zero if none was executed.

2.1 语法格式

while condition
do
    statements
done
until condition
do
    statements
done

2.2 补充相关常用命令

(1)read命令

语法格式

read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

参数说明:

  • -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
  • -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
  • -p 后面跟提示信息,即在输入前打印提示信息。
  • -e 在输入的时候可以使用命令补全功能。
  • -n 后跟一个数字,定义输入文本的长度,很实用。
  • -r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
  • -s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
  • -t 后面跟秒数,定义输入字符的等待时间。
  • -u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。

示例

读取文件(以下两种方式等价)

cat /etc/hosts | while read line 
do
	echo "$line"
done
while read line
do 
	echo "$line"
done < /etc/hosts

二、选择语句

1. case和select语句

  • case word in [ [(] pattern [ | pattern ] … ) list ;; ] … esac
    A case command first expands word, and tries to match it against each pattern in turn, using the same matching rules as for pathname expansion. The word is expanded using tilde expansion, parameter and variable expansion, arithmetic substitution, command substitution, process substitution and quote removal. Each pattern examined is expanded using tilde expansion, parameter and variable expansion, arithmetic substitution, command substitution, and process substitution. If the shell option nocasematch is enabled, the match is performed without regard to the case of alphabetic characters. When a match is found, the corresponding list is executed. If the ;; operator is used, no subsequent matches are attempted after the first pattern match. Using ;& in place of ;; causes execution to continue with the list associated with the next set of patterns. Using ;;& in place of ;; causes the shell to test the next pattern list in the statement, if any, and execute any associated list on a successful match. The exit status is zero if no pattern matches. Otherwise, it is the exit status of the last command executed in list.

语法格式

case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        statement2
        ;;
    pattern3)
        statement3
        ;;
    ……
    *)
        statementn
esac

case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式。

  • expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。
  • pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。

case 会将 expression 的值与 pattern1、pattern2、pattern3 逐个进行匹配:

  • 如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。
  • 如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句(*表示其它所有值),直到遇见双分号;;或者esac才结束。*)相当于多个 if 分支语句中最后的 else 部分。

  • select name [ in word ] ; do list ; done
    The list of words following in is expanded, generating a list of items. The set of expanded words is printed on the standard error, each preceded by a number. If the in word is omitted, the positional parameters are printed. The PS3 prompt is then displayed and a line read from the standard input. If the line consists of a number corresponding to one of the displayed words, then the value of name is set to that word. If the line is empty, the words and prompt are displayed again. If EOF is read, the command completes. Any other value read causes name to be set to null. The line read is saved in the variable REPLY. The list is executed after each selection until a break command is executed. The exit status of select is the exit status of the last command executed in list, or zero if no commands were executed.

语法格式

select variable [in value_list]
do
    statements
done

运行到 select 语句后,取值列表 value_list 中的内容会以菜单的形式显示出来,用户输入菜单编号,就表示选中了某个值,这个值就会赋给变量 variable,然后再执行循环体中的 statements(do 和 done 之间的部分)。

每次循环时 select 都会要求用户输入菜单编号,并使用环境变量 PS3 的值作为提示符,PS3 的默认值为#?,修改 PS3 的值就可以修改提示符。

如果用户输入的菜单编号不在范围之内,例如上面我们输入的 9,那么就会给 variable 赋一个空值;如果用户输入一个空值(什么也不输入,直接回车),会重新显示一遍菜单。

注意,select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环。

示例

PS3="What you like most of the open source system?"
select i in CentOS RedHat Ubuntu 
do
	echo "Your Select System: "$i
Done

select in 通常和 case in 一起使用,在用户输入不同的编号时可以做出不同的反应。

三、函数

shell 函数是一个像简单命令一样调用的对象,并使用一组新的位置参数执行复合命令。shell函数声明如下:

[ function ] name () compound-command [redirection]
This defines a function named name. The reserved word function is optional. If the function reserved word is supplied, the parentheses are optional. The body of the function is the compound command compound-command. That command is usually a list of commands between { and }, but may be any command listed under Compound Commands above. compound-command is executed whenever name is specified as the name of a simple command. Any redirections specified when a function is defined are performed when the function is executed. The exit status of a function definition is zero unless a syntax error occurs or a readonly function with the same name already exists. When executed, the exit status of a function is the exit status of the last command executed in the body.

shell 函数(如上述定义)存储一系列命令以供以后执行。当 shell 函数的名称用作简单命令名称时,将执行与该函数名称关联的命令列表。函数在当前 shell 的上下文中执行;没有创建新进程来解释它们(与 shell 脚本的执行进行对比)。当执行函数时,函数的参数在其执行期间成为位置参数。更新特殊参数#以反映更改。特殊参数0不变。当函数执行时, FUNCNAME变量的第一个元素设置为函数的名称。

函数的局部变量可以使用local内置命令来声明。通常,变量及其值在函数及其调用者之间共享。

函数可以是递归的。递归调用的次数没有限制。

语法格式

function name() {
    statements
    [return value]
}

简化写法,可以不写 function 关键字:

name() {
    statements
    [return value]
}

如果写了 function 关键字,也可以省略函数名后面的小括号:

function name {
    statements
    [return value]
}

函数调用
调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可。

如果传递参数,那么多个参数之间以空格分隔:

name param1 param2 param3

不管是哪种形式,函数名字后面都不需要带括号。

和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。

Shell 也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。

四、数组

Bash提供一维索引和关联数组变量。任何变量都可以用作索引数组;内置的declare将显式声明一个数组。数组的大小没有最大限制,也没有对成员进行连续索引或分配的要求。索引数组使用整数(包括算术表达式)引用,并且是从零开始的;使用任意字符串引用关联数组。

如果使用语法name [ subscript ]= value分配任何变量,则会自动创建索引数组。下标 被视为算术表达式,其计算结果必须大于或等于零。要显式声明索引数组,请使用declare -a name。declare -a name [subscript]也被接受;下标被忽略。

关联数组是使用declare -A name创建的。

可以使用declarereadonly内置函数为数组变量指定属性。每个属性适用于数组的所有成员。

数组使用name = ( value 1 … value n )形式的复合赋值进行分配,其中每个值的形式为 [ subscript ]= string。索引数组赋值不需要括号和下标。当分配给索引数组时,如果提供了可选的括号和下标,则该索引被分配;否则,分配的元素的索引是该语句分配的最后一个索引加一。索引从零开始。

分配给关联数组时,需要下标。

这个语法也被内建的declare接受。可以使用上面介绍的 name [ subscript ]= value语法来分配各个数组元素 。

数组的任何元素都可以使用 ${ name [ subscript ]} 引用。需要使用大括号以避免与路径名扩展发生冲突。如果 下标是@或*,则该词将扩展到name的所有成员。仅当单词出现在双引号内时,这些下标才会有所不同。如果单词用双引号引起来,则 ${ name [*]} 扩展为单个单词,每个数组成员的值由 IFS 特殊变量的第一个字符分隔,而 ${ name [@]} 扩展每个数组元素名称为一个单独的单词。当没有数组成员时,${ name[@]} 扩展为空。如果双引号扩展发生在单词内,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后部分连接。这类似于特殊参数*和@的扩展(参见上面的特殊参数)。${# name [ subscript ]} 扩展为 ${ name [ subscript ]}的长度。如果下标是*或@,扩展是数组中元素的数量。引用不带下标的数组变量相当于引用下标为 0 的数组。

如果下标已被赋值,则数组变量被视为已设置。空字符串是有效值。

unset内置函数用于销毁数组。unset name [ subscript ] 破坏索引下标处的数组元素。必须小心避免路径名扩展引起的不良副作用。unset name,其中name是一个数组,或unset name [ subscript ] ,其中下标是*或@,删除整个数组。

declare 、local和readonly内置函数各自接受-a选项来指定索引数组,并接受-A选项来指定关联数组。read内置函数接受-a选项将从标准输入读取的单词列表分配给数组。set和 声明内置函数以允许将数组值重用为赋值的方式显示数组值。

查看数组所有元素: ${A[@]}数组所有参数
查看数组元素个数:${#A[@]}元素个数
删除元素:unset A[2]

字符串替换:
${string/substring/replacement} 使用replacement,来代替第一个匹配的substring
${string//substring/replacement} 使用replacement, 代替所有匹配的substring

你可能感兴趣的:(Linux,Shell,linux,自动化,运维)