如何建微信微商城网站抖音关键词查询工具
一、基本介绍
1、如何传递参数
向shell脚本传递数据的最基本方法就是通过命令行参数。如下,这条命令会向test.sh脚本传递10和20这两个参数。
./test.sh 10 20
2、如何读取参数
bash shell会将所有的命令行参数都指派给称作位置参数(positional parameter)的特殊变量,包括shell脚本名称。
$0:对应脚本名;
$1:对应第一个命令行参数
$2:对应第二次命令参数
以此类推,直到$9
#!/bin/bash#计算阶乘
factorial=1
for (( a = 1; a <= $1; a++ ))
dofactorial=$[ $factorial * $a ]
done
echo "$1的阶乘是$factorial."
因为传入的参数之间是以空格分隔的,如果传入的参数带有空格,就需要使用引号。
#!/bin/bashecho "Hello $1, you are a good man."
exit
3、参数超过9个
如果想要传入的参数超过9个,需要在第9个位置变量后,在变量名的两侧加上花括号,如${10}。
#!/bin/bashproduct=$[ ${10} * ${11} ]
echo "第10个参数是${10}."
echo "第11个参数是${11}."
echo "product的值是$product."
exit
4、读取脚本名
如下示例会将命令名或绝对路径都当成是脚本的名称。
#!/bin/bashecho "脚本的名字是:$0"
exit
bashname命令能返回不包含命令名或绝对路径的脚本名。
#!/bin/bash#使用basename返回不包含路径的shell脚本名
shellname=$(basename $0)
echo "脚本名字是:$shellname"
exit
5、检查命令行参数是否为空
#!/bin/bashif [ -n "$1" ] #检查命令行第一个参数是否为空
thenfactorial=1for (( a = 1; a <= $1; a++ ))dofactorial=$[ $factorial * $a ]doneecho "$1的阶乘是$factorial."
elseecho "你没有提供命令行参数。"
fi
exit
二、特殊参数变量
1、$#
特殊变量$#可以获取到shell脚本运行时携带的命令行参数的数量。
#!/bin/bashif [ $# -ne 2 ]
thenecho "shell脚本$(basename $0)提供的命令行参数不够。"
elsetotal=$[ $1 + $2 ]echo "两个命令行参数的和是$total"
fi
exit
2、${!#}
${!#}获取命令行中的最后一个参数。
#!/bin/bashecho "总共有$#个命令行参数。"
echo "其中命令行的最后一个参数是${!#}。"
exit
3、$*和$@
$*变量会将所有的命令行参数视为一个单词,而这个单词会包含命令行中出现的每一个参数。$*变量会将这些参数视为一个整体,而不是一系列个体。
$@变量则会将所有的命令行参数视为同一字符串中的多个独立的单词,方便遍历访问。
当$*出现在双引号内时,会被扩展成由多个命令行参数组成的单个单词,每个参数之间以IFS变量值的第一个字符分隔,即,“$*”会被扩展为“$1c$2c$3c...”(其中c是IFS变量值的第一个字符)
当$@出现在双引号内时,它所包含的各个命令行参数会被扩展成独立的单词,即,“$@”会被扩展为"$1""$2""$3"...
#!/bin/bashecho "使用\$*方法,参数是:$*"
count=1
for param in "$*"
doecho "\$*方法参数#$count = $param"count=$[ $count + 1 ]
done
#!/bin/bashecho "使用\$@方法,参数是:$@"
count=1
for param in "$@"
doecho "\$@方法参数 #$count = $param."count=$[ $count + 1 ]
done
echo
exit
4、移动参数shift命令
shift命令可以根据命令行参数的相对位置进行移动。默认情况下,它会将每个位置的变量值都向左移动一个位置,$3的值移入$2,$2的值移入$1,$1的值会被删除(变量$0的值是脚本名,不会改变)。如果某个参数被移除后,那么它的值就被丢弃而无法恢复了。
通过shift命令可以用来遍历命令行参数,尤其是在不知道到底有多少参数的时候,可以只操作第一个位置变量,移动参数,然后继续处理该变量。
#!/bin/bashecho #打印空行
echo "使用shift命令进行移位操作。"
count=1
while [ -n "$1" ] #测试第一个参数值的长度,当长度为0时,结束循环
doecho "参数 #$count = $1"count=$[ $count + 1 ]shift
done
echo
exit
一次性移动多个位置,只需给shift命令提供一个参数,指明要移动的位置数: shift n
#!/bin/bashecho
echo "所有的命令行参数是:$@"
echo "现在向左移动两位。"
shift 2
echo "移位后第一个参数是:$1"
echo
exit
三、处理bash命令中的选项
命令行参数是在命令/脚本名之后出现的各个单词,其中,以连字符(-)或双连字符(--)起始的参数,因为它们能够改变命令的行为,所以称作为命令行选项。命令行选项是一种特殊形式的命令行参数。
1、处理简单命令行选项
同样可以使用shift命令处理命令行选项。
#!/bin/bashecho
while [ -n $1 ]
docase "$1" in-a) echo "找到-a命令行选项。";;-b) echo "找到-b命令行选项。";;-c) echo "找到-c命令行选项。";;*) echo "$1不是一个命令行选项。";;esacshift
done
echo
exit
2、分离命令行参数和选项
在Linux中,可以使用双连字符(--)将命令行选项和参数分开。
#!/bin/bashecho
while [ -n "$1" ]
docase "$1" in-a) echo "-a是命令行选项";;-b) echo "-b是命令行选项";;-c) echo "-c是命令行选项";;--) shift #在遇到双连字符时需要将其移出位置变量,然后用break跳出while循环break;;*) echo "$1不是命令行选项"esacshift
doneecho
count=1
for param in $@
doecho "参数#$count:$param"count=$[ $count + 1 ]
done
echo
exit
不使用双连字符时
使用双连字符时
3、处理含参数的选项
有些命令行选项需要一个额外的参数值。如下所示:
#!/bin/bashecho
while [ -n "$1" ]
docase "$1" in-a) echo "-a是命令行选项";;-b) param=$2echo "-b是命令行选项,且带着参数$param"shift;;-c) echo "-c是命令行选项";;--) shift #在遇到双连字符时需要将其移出位置变量,然后用break跳出while循环break;;*) echo "$1不是命令行选项"esacshift
doneecho
count=1
for param in $@
doecho "参数#$count:$param"count=$[ $count + 1 ]
done
echo
exit
由于要处理的命令行选项位于$1,那么额外的参数值就应该在$2(前面所有的参数在处理完之后都会被移出),所以只要从$2变量中提取出来就可以了。最后,因为这个命令行选项占用了两个位置,所以还需要使用shift命令多移动一次。
只要记住放置好相应的命令行选项参数,无论按什么顺序放置命令行选项都可以。如下所示:
4、getopt命令
介绍
getopt命令可以接受一系列任意形式的命令行选项和参数,并自动将其转换成适当的形式。
格式:
getopt optstring parameters
optstring定义了有效的命令行选项的字母,同时也定义了哪些命令行选项需要参数值。
先在optstring里列出要在脚本中用到的每个命令行选项字母,其次在每个需要参数值的选项字母后面加一个冒号。
示例:getopt ab:cd -a -b Bparam -cd test1 test2
optstring定义了4个有效的命令行选项字母:a、b、c、d。冒号(:)放在了字母b的后面,表明b命令行选项需要一个参数值。当getopt命令运行时,会检查参数列表(-a -b Bparam -cd test1 test2),并基于提供的optstring进行解析。它会自动将-cd分成两个单独的命令行选项,并插入双连字符来分隔命令行中额外的参数。
如果optstring未包含用户指定的选项,就会报错。
如果想忽略这条报错,使用选项-q:
在脚本中如何使用
可以借助能够处理shell中各种变量的set命令。
set命令有一个选项是双连字符(--),它可以将位置变量的值替换成set命令所指定的值。
首先,将脚本的命令行参数传给getopt命令;然后再将getopt命令的输出传给set命令,用getopt格式化后的命令行参数来替换原始的命令行参数。
set -- $(getopt -q ab:cd "$@")
#!/bin/bash
set -- $(getopt -q ab:cd "$@")echo
while [ -n "$1" ]
docase "$1" in-a) echo "-a是命令行选项";;-b) param=$2echo "-b是命令行选项,且带着参数$param"shift;;-c) echo "-c是命令行选项";;--) shift #在遇到双连字符时需要将其移出位置变量,然后用break跳出while循环break;;*) echo "$1不是命令行选项"esacshift
doneecho
count=1
for param in $@
doecho "参数#$count:$param"count=$[ $count + 1 ]
done
echo
exit
5、getopts命令
getopt的缺点在于不擅长处理带空格和引号的参数值,如果遇到后,它会将空格当做参数分隔符,而不是根据引号将二者当做一个参数。
getopt与getopts的区别:前者在将命令行中的选项和参数处理后只生成一个输出,而后者能够和已有的shell位置变量配合默契。
getopts每次只会处理一个检测到的命令行参数,在处理完所有的参数后,getopts就会退出,同时返回一个大于0的退出状态码。使其非常适合用在解析命令行参数的循环中。
格式:
getopts optstring variable
optstring的用法与在getopt里的一致,不同的是,如果不想显示错误消息的话,可以在optstring之前加一个冒号。optstring中未定义的选项字母会以问号的形式传给脚本。
getopts命令会将当前参数保存在命令行中定义的variable中。
getopts命令需要用到两个环境变量:OPTARG和OPTIND;前者保存选项加带的参数值,后者保存参数列表中getopts正在处理的参数位置,这样在处理完当前选项之后就能继续处理其他命令行参数了。
#!/bin/bashecho
while getopts :ab:c opt
docase "$opt" ina) echo "-a是命令行选项";;b) echo "-b是命令行选项,且带着参数值$OPTARG";;c) echo "-c是命令行选项";;*) echo "未知的命令行选项:$opt";;esac
done
exit
在解析命令行选项时,getopts命令会移除起始的连字符(-),所以在case语句中不用连字符。
可以在参数值中加入空格
可以将命令行选项字母与参数值写在一起,且两者之间不加空格。
getopts命令可以将在命令行中找到的所有未定义的命令行选项统一输出成问号。
getopts命令知道何时停止处理命令行选项,并将参数值留给用户处理。在处理每个选项时,getopts都会将OPTIND环境变量值加1,处理完选项后,就可以使用shift命令和OPTIND值来移动参数。
#!/bin/bashecho
while getopts :ab:cd opt
docase "$opt" ina) echo "-a是命令行选项";;b) echo "-b是命令行选项,且带着参数值$OPTARG";;c) echo "-c是命令行选项";;d) echo "-d是命令行选项";;*) echo "未知的命令行选项:$opt";;esac
doneshift $[ $OPTIND - 1 ]
echo
count=1
for param in "$@"
doecho "参数#$count:$param"count=$[ $count + 1 ]
done
echo
exit
四、常用的Linux命令行选项
-a | 显示所有对象 |
-c | 生成计数 |
-d | 指定目录 |
-e | 扩展对象 |
-f | 指定读入数据的文件 |
-h | 显示命令的帮助信息 |
-i | 忽略文本大小写 |
-l | 产生长格式输出 |
-n | 使用非交互模式(批处理) |
-o | 将所有输出重定向至指定的文件 |
-q | 以静默模式运行 |
-r | 递归处理目录和文件 |
-s | 以静默模式运行 |
-v | 生成详细输出 |
-x | 排除某个对象 |
-y | 对所有问题回答yes |
五、获取用户输入
有时候脚本需要用户更多的交互性,比如在脚本运行时询问用户并等待用户的回答。
1、read命令
read命令从标准输入(键盘)或另一个文件描述符中接受输入,获取到输入后,它会将数据存入变量。
#!/bin/bashecho -n "请输入你的名字:" # -n选项不会在字符串末尾输出换行符,允许脚本用户紧跟其后输入数据read name
read -p "请输入你的年龄:" age # -p选项允许直接指定提示符。
days=$[ $age * 365 ]echo "你好,$name. 恭喜你,已经活了$days天。"
exit
read命令会将提示符后输入的所有数据分配给单个变量。如果指定多个变量,则输入的每个数据值都会分配给变量列表中的下一个变量,如果变量数量不够,则剩下的数据就全部分配给最后一个变量。
#!/bin/bashread -p "请输入你的姓与名:"family_name last_name
echo "你的姓是$family_name,名是$last_name"
exit
read命令中也可以不指定任何变量,如此read命令就会将接收到的所有数据都放进特殊环境变量REPLY中。REPLY环境变量包含输入的所有数据。
#!/bin/bashread -p "请输入你的姓名:"
echo
echo "你好,$REPLY!"
exit
2、超时
如果用户一直不输入,那么read命令就会一直等待,此时可以用 -t 选项指定计时器,如果计时器超时,read命令会返回一个非0的退出状态码。
#!/bin/bashif read -t 5 -p "请输入你的姓名:" name
thenecho "你的姓名是:$name"
elseechoecho "你一直没有输入,所以不再继续等待。"
fi
exit
使用read命令的 -n 选项统计输入的字符个数,当字符个数达到预期值时,就自动退出脚本,并将已输入的数据赋给变量。
#!/bin/bash# -n 1告诉read命令在接收到单个字符后就退出。
read -n 1 -p "你是否想继续?[Y/N]" answercase $answer inY | y) echoecho "好的,请继续……";;N | n) echoecho "好的,结束。"exit;;
esac
echo "脚本已结束。"
exit
3、无显示读取
从用户处得到输入,但不想在屏幕上显示出用户的输入信息,比如,输入密码。
-s 选项可以让在read命令中输入的数据出现在屏幕上(其实数据还是会被显示,只不过read命令将文本颜色设成了和背景色一样)
#!/bin/bashread -s -p "请输入你的密码:" passwd
echo
echo "你的密码是:$passwd"
exit
4、读取文件
可以使用read命令读取文件。每次调用read命令都会从指定文件中读取一行文本。当文本中没有内容可读时,read命令会退出并返回一个非0的退出状态码。
如何将文件的数据传递给read命令,最常见的方法是对文件使用cat命令,然后将结果通过管道直接传给含有read命令的while命令。
#!/bin/bashcount=1
cat $HOME/ning/test.txt | while read line
doecho "Line $count:$line"count=$[ $count + 1 ]
done
echo "已处理完该文件。"
exit