解释器与编译器
1. 编译器过程: 源代码 - 预处理器 - 编译器 - 目标代码 - 链接器 - 可执行程序
2. 解释器过程: 源代码 - 解释器 (python ,shell , js)
如何学习脚本: 三步骤
1. 学语法
2. 看脚本
3. 抄
基本语法:省略 。 自己去 w3c学习 。
常用语法记录:
#!/bin/bash
IS_ZSH=""
# bash-3.2 和 zsh
: << !
Shebang(Hashbang):一个由井号和叹号构成的字符序列#!出现在文本文件的第一行的前两个字符。
操作系统的程序加载器会分析Shebang后的内容,将这些内容作为解释器指令。
并调用该指令,并将载有Shebang的文件路径作为该解释器的参数。
#!/usr/bin/python
#!/usr/bin/env pyhon
env:不同对操作系统,脚本解释器可能被安装于系统的不同的目录,设置到系统的PATH中。
env可以在系统的PATH目录中查找。
上述命令,使用在用户路径中找到的第一个Python版本。但是可以通过指定版本号:
#!/usr/bin/env pythonX.x
env也可以指定搜索目录:
#!/usr/bin/env -S -P/usr/local/bin:/usr/bin:${PATH} python
会在/usr/local/bin、/usr/bin、系统PATH搜索python。
!
# echo "单行注释"
: << !
多行注释方式一:
echo "多行注释"
!
: << COMMENT
多行注释方式二:
echo "多行注释"
COMMENT
: '
多行注释方式三:
echo "多行注释"
'
if false; then
多行注释方式四:
echo "多行注释"
fi
((0)) && {
多行注释方式五:
echo "多行注释"
}
# 有空格时,将串包裹起来
VARIABLE="Some string"
LUE=VARIABLE
# FOO=""
LONG_STRING="I am Cat\\"
LONG_LONG_STRING="I am Cat!CAT!Cat!Cat"
: 'COMMENT
单引号与双引号,括号一定要成对
冒号(:)作为内建命令:占位符、参数扩展和重定向
子进程:在当前的shell下,去打开另一个新shell
env:查看环境变量与常见环境变量说明
PS1:提示符设置 [\u@\h \w \A #\#]\$
1. \h 主机名缩写
2. \u 用户账号名称
3. \w 完整工作路径
4. \A 24小时时间
5. \# 第几个命令
6. \$ 提示符,如果是root,提示符为#,否则是$
HOME:代表用户主文件夹。
SHELL:当前使用的是那个SHELL
PATH:执行文件查找路径
export: 自定义变量转环境变量
locale:显示语系变量
read [-pt] 变量 读取键盘变量
-p:提示符
-t:等待秒数
$(( 20 + 5 * 6)):返回双括号内算数运算的结果。
expr命令是一款表达式计算工具,使用它完成表达式的求值操作。
eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描后,cmdLine是个普通命令,则执行此命令;
如果cmdLine中含有变量的间接引用,则保证间接引用的语义。
type:显示命令属性,不加参数时,会显示该命令是内置命令还是其他。
-t:显示命令属性缩写
file:代表外部命令。
alias:代表该命令为别名。
builtin:内置命令。
-p:为外部命令时,会显示命令所在的文件
-a:将PATH中设置的所有的与命令名相关的列出来
echo [-ne][字符串]
-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理
\a 发出警告;
\b 删除前一个字符;
\c 不产生进一步输出 (\c 后面的字符不会输出);
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入 nnn(八进制)所代表的ASCII字符;
用echo命令打印带有色彩的文字:
文字色:
echo -e "\e[1;31mThis is red text\e[0m"
\e[1;31m 将颜色设置为红色
\e[0m 将颜色重新置回
颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37
背景色:
echo -e "\e[1;42mGreed Background\e[0m"
颜色码:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47
文字闪动:
echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"
红色数字处还有其他数字参数:0 关闭所有属性、1 设置高亮度(加粗)、4 下划线、5 闪烁、7 反显、8 消隐
COMMENT'
#
# if [ true ]; then
# :
# fi
#${VAR:=DEFAULT}
: ${VAR:=DEFAULT}
echo $VAR
: 'COMMENT
1. Shell变量默认为字符串。shell不关心这个串是什么含义。
2. Shell默认的数值运算是整数类型。所以若要进行数学运算,必须使用一些命令例如declare、expr、双括号等。
3. Shell变量可分为两类:
i. 局部变量:只在创建它们的shell中可用。在函数内定义,函数执行后就被删除。
ii. 环境变量:可以在创建它们的shell及其派生出来的任意子进程中使用。在整个脚本执行期间,只要没有被删除就一直存在。
3. 定义规则:变量名必须以字母或下划线字符开头。其余的字符可以是字母、数字(0~9)或下划线字符。任何其他的字符都标志着变量名的终止。
小写敏感。
4. 给变量赋值时,等号周围不能有任何空白符。
5. 通常大写字符为系统默认变量。个人习惯。
6. set:查看所有变量(含环境变量与自定义变量),以及设置shell变量的新变量值。
-a:标示已修改的变量,以供输出至环境变量。
-b:使被中止的后台程序立刻回报执行状态。
-e:若指令传回值不等于0,则立即退出shell。
-f:取消使用通配符。
-h:自动记录函数的所在位置。
-H Shell:可利用"!"加<指令编号>的方式来执行history中记录的指令。
-k:指令所给的参数都会被视为此指令的环境变量。
-l:记录for循环的变量名称。
-m:使用监视模式。
-n:只读取指令,而不实际执行。
-p:启动优先顺序模式。
-P:启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
-t:执行完随后的指令,即退出shell。
-u:当执行时使用到未定义过的变量,则显示错误信息。
-v:显示shell所读取的输入值。
-x:执行指令后,会先显示该指令及所下的参数。
7. declare/typeset [-aixrp] 变量
-a 将变量定义成数组
-i 将变量定义成整数
-x 将变量定义成环境变量
-r 将变量定义成readonly
-p:显示变量定义的方式和值
+:取消变量属性,但是 +a 和 +r 无效,无法删除数组和只读属性,可以使用unset删除数组,但是 unset 不能删除只读变量。
8. local关键字,用来在作用域内创建变量。出来作用域被销毁。
9. export为shell变量或函数设置导出属性,成为环境变量。无法对未定义的函数添加导出属性。同时,重要的一点是,export的效力仅及于该次登陆操作。
注销或者重新开一个窗口,export命令给出的环境变量都不存在了。
-f:代表[变量名称]为函数名称。。
-n:删除变量的导出属性。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p:显示全部拥有导出属性的变量。
-pf:显示全部拥有导出属性的函数。
-nf:删除函数的导出属性。
--:在它之后的选项无效。
10. 通配符
*:匹配任意字符串,包括空字符串,不包含对“/”字符的匹配。
?:匹配任意单个字符,不能匹配“/”字符。
[abc]:匹配“a”或者“b”或者“c”字符。
[^abc]:不匹配“a”或者“b”或者“c”字符。
[a-z]:匹配26个英文小写字符中任意一个。
用set命令可以查看所有的变量,unset var命令可以清除变量var,var相当于没有定义过。
readonly var可以把var变为只读变量,定义之后不能对var进行任何更改。
COMMENT'
if [[ -n $IS_ZSH ]]; then
# 根据变量属性强制转换值的英文大小写。
declare -u uc_var='abc'
declare -l lc_var='ABC'
# 显示'ABC abc';
echo "${uc_var} ${lc_var}"
fi
# 执行后显示7,注意空格。
# expr 3 + 4
# result=`expr 2 + 3`
# echo $result
# # 没有指定整型属性,输出为字符串'a+b'。
# declare a=3 b=4 c
# c=a+b
# # a+b
# echo ${c}
# declare -p a
# # 不过可以使用以下方式赋值。
# c=$((a+b))
# # 7
# echo ${c}
# 设置了整型属性就可以直接加了。
# declare -i a=3 b=4 c
# c=a+b
# # 7
# echo ${c}
# declare -p a
# declare -p VARIABLE
# # 定义函数内的全局变量
# function test() {
# declare testA=3
# VARIABLE="Value"
# local testB=3
# # 让我们查看它们的属性。
# declare -p testA VARIABLE testB
# }
# # 执行函数。
# test
# #Value
# echo $testA $VARIABLE $testB
# export a b=3
# # 当然也可以先定义后增加导出属性
# export VARIABLE
# 删除变量的导出属性
# export -n a b
# function func_1(){ echo '123'; }
# # 为已定义函数增加导出属性
# export -f func_1
# # 删除函数的导出属性
# export -fn func_1
# set 11 22 33 44
# # 44
# echo $4
# # $4
# echo "\$$#"
# # 44 第一遍得到变量个数4,第二遍去第四个
# eval echo "\$$#"
# declare mylove='Cat' #定义新变量
# # env | grep mylove mylove=Cat
# set -a mylove #设置为环境变量
# echo "./*.sh"
# echo "./*".sh
# MMM=`echo "./*.sh"`
# echo $MMM
# echo `echo "./*.sh"`
# echo ./*.sh
# set -- "./"*.sh
# echo "$1"
: 'COMMENT
数组:
var[1]="var1"
var[2]=1
COMMENT'
# source Shell.sh
export VARIABLE
unset VARIABLE
echo $VARIABLE
: 'COMMENT
运行方式:
1. sh:
使用$ sh script.sh执行脚本时,当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。
脚本执行完毕,退出子shell,回到当前shell。$ ./script.sh与$ sh script.sh等效。
2. source:
使用$ source script.sh方式,在当前上下文中执行脚本,不会生成新的进程。脚本执行完毕,回到当前shell。
$ . script.sh与$ source script.sh等效。
3. exec方式:
使用exec command方式,会用command进程替换当前shell进程,并且保持PID不变。
执行完毕,直接退出,不回到之前的shell环境。
COMMENT'
: 'COMMENT
参数扩展:通过符号$获得参数中存储的值。
1. 间接参数扩展${!parameter},,zsh不支持
i. ${parameter-string}:当parameter未设置则替换成string,不更改parameter值。否则,不做处理。
ii. ${parameter=string}:当parameter未设置则替换成string,更改parameter值。否则,不做处理。
iii. ${parameter?string}:parameter没有设置,则把string输出到标准错误中。否则,不做处理。
iiii. ${parameter+string}:当parameter为空的时替换成string。否则,不做处理。
2. 冒号后面跟 等号,加号,减号,问号(⚠不能有空格):
i. ${parameter:-string}:当parameter未设置或者为空则替换成string,不更改parameter值。
ii. ${parameter:=string}:当parameter未设置或者为空则替换成string,更改parameter值。
iii. ${parameter:?string}:若变量parameter不为空,则使用变量parameter的值。
若为空,则把string输出到标准错误中,并从脚本中退出。
iiii. ${parameter:+string}:当parameter不为空的时替换成string。若为空时则不替换或者说是替换空值。
3. 子串扩展:${parameter:offset}和${parameter:offset:length}。
从offset位置开始截取长度为length的子串,如果没有提供length,则是从offset开始到结尾。
i. offset可以是负值,且必须与冒号有间隔或者用()包裹。开始位置是从字符串末尾开始算起,然后取长度为length的子串。
例如,-1代表是从最后一个字符开始。
ii. parameter是@,也就是所有的位置参数时,offset必须从1开始。
4. 替换:${parameter/pattern/string}、${parameter//pattern/string}、${parameter/pattern}和${parameter//pattern}。
大小写敏感。string为空时,则相当于将匹配的子串删除。 parameter之后如果是/,则只匹配遇到的第一个子串;
parameter之后如果是//,则匹配所有的子串。
5. 删除:${parameter#pattern}、${parameter##pattern}、${parameter%pattern}和${parameter%%pattern}。
i. # 是去掉左边,% 是去掉右边。单一符号是最小匹配﹔两个符号是最大匹配。
6. 参数长度:${#parameter}
COMMENT'
: 'COMMENT
标准输入(stdin):代码为0,使用<或<<;
标准输出(stdout):代码为1,使用>或>>;
标准错误输出(stderr):代码为2,使用2>或2>>;
1> 以覆盖的方式将正确的数据输出到指定到文件或设备;
1>> 以累加到方法将正确到数据输出到指定到文件或者设备上;
2> 以覆盖的方式将错误的数据输出到指定到文件或设备;
2>> 以累加的方式将错误的数据输出到指定到文件或设备;
2>/dev/null 将错误到数据丢弃,只显示正确到数据
2>&1 或者 &>将正确到数据和错误到数据写入同一个文件
cmd;cmd 不考虑命令相关性,连续执行。
当前一个命令执行成功会回传一个 $?=0的值。
cmd1 && cmd2 如果第一个命令的$?为0,则执行第二个命令。
cmd1 || cmd2 如果第一个命令的$?为0,则不执行第二个命令。否则执行第二个命令。
|:管道仅能处理前面一个命令传来的正确信息,将正确信息作为stdin传给下一个命令
- :stdin和stdout利用减号“-“来代替
COMMENT'
: 'COMMENT
sh [-nvx] scripts.h
-n:不执行,仅检查语法。
-v:在执行脚本之前,先将脚本内容输出。
-x:将使用到的脚本内容,输出。
COMMENT'
: 'COMMENT
当条件成立,就进行循环:
while [ condation ] #判断条件
do #循环开始
程序
done #循环结束
当条件成立,就终止循环:
until [ condation ] #判断条件
do #循环开始
程序
done #循环结束
按照指定次数循环:
for var in con1 con2 con3 ...
do
程序
done
for (( 初始值; 限制值; 执行步长 ))
do
程序
done
COMMENT'
: 'COMMENT
多分支语句判断
除最后一个分支外(这个分支可以是普通分支,也可以是*)分支),其它的每个分支都必须以;;结尾,;;代表一个分支的结束,不写的话会有语法错误。
最后一个分支可以写;;,也可以不写,因为无论如何,执行到 esac 都会结束整个 case in 语句。
case $变量 in
"第一个变量内容")
程序
;; #结束
*) # 用来托底,没有匹配到数据
;;
esac
COMMENT'
: 'COMMENT
一个条件判断:
if [ condation ]; then
成立
else
不成立
fi
多条件判断:
if [ condation ]; then
成立
elif [ condation ]; then
成立
else
不成立
fi
COMMENT'
: 'COMMENT
shift:参数号码偏移。会移动变量,可以接数字,代表移动前面几个参数的意思
COMMENT'
: 'COMMENT
[]:判断符号,两个等号和一个等号,效果类似。
1. 中括号里面的每个组件都需要空格分隔。
2. 中括号的变量,使用双引号
3. 中括号的常量,使用单引号或双引号
COMMENT'
: 'COMMENT
test命令测试:
1. test n1 -eq n2:
-eq:相等
-ne:不等
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
2. 字符串判断
-z string:判断string是否为0,为空,则为true。
-n string:判断string是否非0,为空,则为false。
string1 = string2:字符串是否相等,相等为true。
string1 != string2:字符串是否不等,相等为false。
3. 多重条件判断
-a:两个条件同时成立,为true。
-o:两个条件任何一个成立,为true。
!:反向。
4. 文件类型判断
-e:文件名是否存在。
-f:该文件名是否存在且是否为文件。
-d:该名称是否存在且为目录。
-L:该名称是否存在且是否为链接文件。
5. 文件权限检测
-r:是否存在是否有可读权限。
-w:是否存在是否有可写权限。
-x:是否存在是否有可执行权限。
-s:是否存在且为非空白文件。
6. 两文件比较
-nt 文件1是否比文件2新。
-ot 文件1是否比文件2旧。
-ef 文件1和文件2是否为同一个文件。
COMMENT'
# # Some string
# echo "${!VALUE}"
# #
# echo "${FOO-"Cat-"}"
# # Cat-
# echo "${FOO="Cat-"}"
# #
# echo "${FOO+"Cat-"}"
# # Cat-
# echo "${FOO?"Cat----"}"
# # Cat-
# echo "${FOO:-"Cat-"}"
# # Cat=
# echo "${FOO:="Cat="}"
# # Cat=
# echo "${FOO:?"Cat?"}"
# #Cat+
# echo "${FOO:+"Cat+"}"
# #Cat\
# echo "${LONG_STRING:5}"
# #Cat
# echo "${LONG_STRING:5:3}"
# #Cat
# echo "${LONG_STRING: -4:3}"
# #Cat
# echo "${LONG_STRING: -4:3}"
# #Cat
# echo "${LONG_STRING:(-4):3}"
# # I am Cat!CAT!Cat!Cat
# echo "${LONG_LONG_STRING/cat}"
# # I am LGCat!CAT!LGCat!LGCat
# echo "${LONG_LONG_STRING//Cat/LGCat}"
# # am Cat!CAT!Cat!Cat
# echo "${LONG_LONG_STRING#* }"
# # am Cat!CAT!Cat!Cat
# echo "${LONG_LONG_STRING#? }"
# # at!CAT!Cat!Cat
# echo "${LONG_LONG_STRING#*[Cc]}"
# if [[ -n $IS_ZSH ]]; then
# # Cat!CAT!Cat!Cat
# echo "${LONG_LONG_STRING#*(AT|m)}"
# echo "-----${LONG_LONG_STRING#*(AT|m)}"
# echo "-----${LONG_LONG_STRING#[A-z]**(AT|m)}"
# # !Cat!Cat
# echo "-----${LONG_LONG_STRING#*(AT|mm)}"
# fi
# # m Cat!CAT!Cat!Cat
# echo "${LONG_LONG_STRING#*[a-t]}"
# # m Cat!CAT!Cat!Cat
# echo "${LONG_LONG_STRING#*[a-t]}"
# # am Cat!CAT!Cat!Cat
# echo "${LONG_LONG_STRING#*[^A-Z]}"
# echo `echo "./*.sh"`
# echo `echo "./"*.sh`
# # Cat!CAT!Cat!Cat
# echo "${LONG_LONG_STRING##* }"
# # at
# echo "${LONG_LONG_STRING##*[Cc]}"
# #
# echo "${LONG_LONG_STRING##*[a-t]}"
# # I am
# echo "${LONG_LONG_STRING% *}"
# # I
# echo "${LONG_LONG_STRING%% *}"
# # 20
# echo "${#LONG_LONG_STRING}"
# # i am cat!cat!cat!cat
# echo "$(echo "${LONG_LONG_STRING}" | tr "[:upper:]" "[:lower:]")"
# # I AM CAT!CAT!CAT!CAT
# echo "$(echo "${LONG_LONG_STRING}" | tr "[:lower:]" "[:upper:]")"
# if [[ -n $IS_ZSH ]]; then
# # I AM CAT!CAT!CAT!CAT
# echo "${LONG_LONG_STRING:u}"
# # i am cat!cat!cat!cat
# echo "${LONG_LONG_STRING:l}"
# fi
# : ${TEM:="./"*.sh}
: 'COMMENT
函数的声明形式:
function 函数名 {
函数体
}
function 函数名() {
函数体
}
函数名() {
函数体
}
1. 有funtion,可以不写(),没有function,必须写()。
2. 函数名和”{“之间必须有空格。
3. 不得声明形式参数。
4. 必须在调用函数地方之前,声明函数
5. 无法重载
6. 后来的声明会覆盖之前的声明
7. 没有返回值的函数,默认返回函数内最后一条指令的返回值。有返回值的函数,只能返回整数。
8. 需要获得函数值,只能通过$?获得。通过=获得是空值。
我们可以将shell中函数,看作是定义一个新的命令,因此各个输入参数直接用空格分隔。
一次,命令里面获得参数方法可以通过:$0...$n得到。$0代表函数本身。
$#:传入的参数的个数。
$*:所有的位置参数(作为单个字符串)。
$@:所有的位置参数(每个都作为独立的字符串)。
$?:当前shell进程中,上一个命令的返回值,如果上一个命令成功执行则$?的值为0,否则为其他非零值。
$$:当前shell进程的pid。
$!:后台运行的最后一个进程的pid。
$-:显示shell使用的当前选项。
$_:之前命令的最后一个参数。
COMMENT'
# 无输出
# logic
# function DoWork {
# local LG_CAT="LG_Cat"
# echo "logic"
# return 2
# }
# DoWork() {
# local LG_CAT="LG_Cat"
# echo "logic"
# return 2
# }
# 无输出
# logic
# function DoWork {
# local LG_CAT="LG_Cat"
# echo "logic"
# return 2
# }
# echo $LG_CAT
# echo `DoWork`
# 无输出
# logic
# function DoWork {
# LG_CAT="LG_Cat"
# echo "logic"
# return 2
# }
# echo $LG_CAT
# echo `DoWork`
# logic
# 无输出
# function DoWork {
# LG_CAT="LG_Cat"
# echo "logic"
# return 2
# }
# echo `DoWork`
# echo $LG_CAT
# logic
# logic
# LG_Cat
# function DoWork {
# LG_CAT="LG_Cat"
# echo "logic"
# return 2
# }
# DoWork
# echo `DoWork`
# echo $LG_CAT
# logic
# 2
# logic
# 0
# function DoWork {
# LG_CAT="LG_Cat"
# echo "logic"
# return 2
# }
# DoWork
# echo "$?"
# echo `DoWork`
# echo "$?"
# function DoWork {
# echo "特殊变量:\n
# \$#:$#\\n
# \$0:$0\\n
# \$1:$1\\n
# \$2:$2\\n
# \$*:$*\\n
# \$@:$@\\n
# \$$:$$\\n
# \$-:$-\\n
# \$_:$_
# "
# return 2
# }
# DoWork "Cat" "LGCat"
array=($MMM 1 2)
echo $array
declare -p MMM
declare -p array
if [[ -n $IS_ZSH ]]; then
declare -A fruits=(['apple']='red' ['banana']='yellow')
# 显示所有关联数组。
declare -A
# red yellow
echo ${fruits[@]}
echo ${fruits[*]}
echo ${(@k)fruits}
fi
脚本实现:
while [[ $# -gt 0 ]]; do
case $1 in
-d|--directory)
shift
echo "$1----"
shift
;;
-k|--keyword)
shift
echo "$1 ----"
shift
;;
-s|-source)
echo "$1 ----source"
shift
;;
-f|--framework)
shift
;;
-l|--lib)
shift
;;
-h|--help)
Show_Help
exit 0
;;
*)
echo "Unknown option: $1"
exit 1
esac
done
通过上面的脚本来学习脚本:
while do case : 循环
[[ $# -gt 0 ]] :
$# ,获取执行脚本的时候传递的参数个数
-gt : 大于
$1: 循环的参数值
exit: 0 正常退出
其他exit: 为自定义意义。
自定义一个脚本说明文档
格式如下:
Show_Help() {
# 结束符
cat <<EOF
find_api.sh --directory <dir> 在指定目录指定文件内搜索指定关键字。
-d|--directory <dir> - 指定查找目录,默认当前所在目录
-k|--keyword <word> - 查找关键字
-s|--source - 指定查找源码文件
-f|--framework - 指定查找framework文件
-l|--lib - 指定查找libs文件
--help - prints help screen
EOF
}
注意EOF不要有空格。
cat <<EOF
中间写上脚本的使用文档
EOF
查找、细分查询功能
find . -name "*.framework"
find . -name "*.h" -exec echo {} \;
grep -E "some|weak" -A 1 -B 1 -i
nm -pa <mach-o>
find : 查找文件 -name '字串' 查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。
grep: 搜索具体文件中的关键字 -E --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式
数组与For循环
# <<< 表示将右侧的字符串传递到左侧命令的标准输入。
# < 将文件的内容传递到命令的标准输入
# << 将带有结束标志的文档内容传递到命令的标准输入
#test
#-e:文件名是否存在。
#-f:该文件名是否存在且是否为文件。
#-d:该名称是否存在且为目录。
#-L:该名称是否存在且是否为链接文件。
#read
#-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
#-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
# read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理;然后循环处理file的第二行、第三行。。。一直到file的最后一行。
#for是每次读取文件中一个以空格为分割符的字符串。
#for是每次读取字符串中一个以空格为分割符的字符串。
#weak|cat|Hank
Find_Api() {
local key_word=""
if [[ -n "${KEYWORD}" ]]; then
read -a names <<< "${KEYWORD}"
for name in ${names[@]}
do
if [[ ! -n "${key_word}" ]]; then
key_word="$name"
else
key_word="$key_word|$name"
fi
done
else
echo "请输入查找的关键字!"
exit 1
fi
echo "$key_word ----"
}