示例脚本及注释

1 - arguments


#!/bin/bash if [ -n "$1" ];then # 验证参数是否传入
echo "The first parameter is ${1}."
else
echo "No arguments!"
fi echo '$0 当前shell脚本的名称:' $0
echo '$0 当前shell脚本的PID:' $$
echo '$* 当前shell脚本的所有参数:' $*
echo '$@ 当前shell脚本的所有参数:' $@
echo '$# 当前shell脚本的参数个数:' $# for param in "$*" # 遍历$*
do
echo "\$* Parameters : $param"
done for param in "$@" # 遍历$@
do
echo "\$@ Parameters : $param"
done ### 依次读取当前shell脚本的所有输入参数
while [ -n "$1" ]
do
echo "参数为:$1, 参数个数为:$#"
shift # shift命令将参数变量左移一个位置
done # ### 执行脚本时,通过对应的位置参数和特殊变量来完成输入;
# $0 当前shell脚本的名称
# $n 当前shell脚本的第n个参数,$1是第一个参数,$2是第二个参数,${10}是第十个参数
# $* 当前shell脚本的所有参数(不包括脚本本身),将所有参数当作一个字符串整体
# $@ 当前shell脚本的所有参数(不包括脚本本身),循环遍历所有参数
# $# 当前shell脚本的参数个数(不包括脚本本身)
# $$ 当前shell脚本的PID
# $? 最后一个指令的返回值(退出状态);0表示没有错误,非0表示有错误
#
#
# ### 移动参数变量
# - shift命令将移动命令行参数变量左移一个位置,$2变量的值将会移动到$1,而$1变量的值将会被删除,且不能恢复;但是$0变量的值不变;
# - “shift n”表示移动n个位置;

2 - shift


#!/bin/bash if [ -z "$1" ] # -z 字符串的长度为零
then
echo "No arguments!"
fi function show_help(){
echo "Usage:"
echo " ./$0 -a Option A"
echo " ./$0 -b Option B"
echo " ./$0 -c Option C"
echo " ./$0 -h Show help information"
} count=1
while [ -n "$1" ] # 判断参数是否存在;–n 字符串的长度非零
do echo "第 $count 个命令行参数 : $1"
count=$[ $count+1 ] case $1 in
-a) echo "Perform action A" ;;
-b) echo "Perform action B" ;;
-c) echo "Perform action C" ;;
-h) show_help ;;
*) echo "$1 is not an option!"
break ;;
esac shift # 命令行参数值左移一位
# shift 2 # 使用"shift n"对命令行参数左移n位 done # ### 简单的命令行选项(只有选项,没有参数)
# - 适合使用shift命令和case语句处理
#
#
# ### shift命令
# - shift命令能够改变命令行参数的相对位置;
# - 默认将每个参数变量左移一个位置;变量$3的值移给变量$2,变量$2的值移位给变量$1,而变量$1的值被丢弃;变量$0的值和程序名称都保持不变;
# - 特别注意:将某一位参数移位掉后,该参数值永久丢失,不可恢复;
# - “shift n”表示移动n个位置;
#
#
# ### case语句
# - 本例中,case语句会匹配和执行所有的有效选项;
# - 如果只想匹配和执行第一个有效选项,不使用while循环和shift命令即可;
# - case语句的catch-all部分可以处理其他参数;

3 - read


#!/bin/sh echo -n "Enter your name:" # “echo -n”移掉字符串末尾的换行符,允许紧跟其后输入数据
read -t 5 name # 设置超时时间为3秒
echo "Hi, $name !" read -p "Enter your age:" age # -p选项,在read命令中指定提示
days=$[ $age * 365 ]
echo "$days days !" read -s -p "What do you want :" w1 w2 # 指定多个变量来获取多个输入
echo "You want to get more $w1 and $w2 !" read -n1 -p "Do you want to continue [Y/N]?" answer # -n1选项,接受到一个字符就退出
case $answer in
Y | y)
echo -e "\n Continue!";;
N | n)
echo -e "\n Goodbye!";;
*)
echo -e "\n Error Choice!";;
esac ### 示例:read命令从文件中读取内容的方法
echo -e "aaa\n222\nccc" > test.log # 创建示例文件
cat test.log # count=1
# cat test.log | while read line
# do
# echo "Line $count : $line"
# count=$[ $count + 1 ]
# done # cat test.log | \
# while read CMD; do
# echo $CMD
# done while read CMD; do
echo "$CMD"
done < test.log rm -rf test.log exit 0 # ### 在脚本运行时,通过read命令以交互的方式获取输入
# - 在脚本中使用“read variable”获取标准输入,并将数据存放到标准变量中;使用“$varialbe”调用输入;
# - read命令可以指定多个变量来获取多个输入;如果输入的值多于变量,多出的值会统一分配给最后一个变量;
# - 如果不指定变量,read命令会将所有接收到的数据都放到特殊环境变量REPLY中;
#
#
# ### read命令常用选项
# -p : 省略echo命令并指定变量名字,可以多个变量;
# -t <n> : 设置超时时间为n秒;
# -n<n> : 当输入的字符数目达到预定数目n时,自动退出,并将输入的数据赋值给变量;
# -s : 隐藏输入(不显示输入的数据),但实际上只是将输入字符的颜色设置与背景色相同;
#
#
# ### read命令从文件中读取内容
# - 利用管道和while循环,可以实现逐行读取文件内容;
# - 如果文件为空(没有数据),read命令会退出并返回非零退出状态码;

4 - getopts


#!/bin/bash function show_help(){
echo "Usage:"
echo " ./$0 -a option A"
echo " ./$0 -b <paramter> option B"
echo " ./$0 -c <paramter> option C"
echo " ./$0 -h Show help information"
} if [ -z "$1" ]
then
echo "No arguments!"
show_help
exit 1
fi str="$1"
if [ "${str:0:1}" != "-" ] || [ -z "${str:1:2}" ]; then
echo "Invalid option!"
exit 1
fi while getopts "ab:c:h" opt;
do
case "$opt" in
a) echo "Perform an action A"
echo "Next option index : $OPTIND";;
b) echo "Perform an action B with parameter value $OPTARG"
echo "Next option index : $OPTIND";;
c) echo "Perform an action C with parameter value $OPTARG"
echo "Next option index : $OPTIND";;
h) show_help;;
\?) echo "Invalid option or parameter!"
show_help
exit 1;;
esac
done # ### getopt和getopts
# - getopt和getopts命令可用于解析所有命令行参数,能够使Shell脚本实现选项列表的功能;
# - getopt是外部命令,可以支持长选项和可选参数;
# - getopts是shell内置命令,能够处理选项和参数之间的空格;自动去除选项前的破折号;但无法处理非-开头的选项;
#
#
# ### getopts命令
# - 使用形式:“getopts <optstring> <variable>”
# - 如果选项字符串optstring以冒号开始,表明禁止输出错误消息;如果其中的选项以冒号结尾,表明此选 项需要参数值;
# - 当前参数放在variable中;
# - 选项必须在其参数之前,而且必须用空格分开;
# - 如果需要参数的选项没有指定参数,将向标准错误中写入错误消息;
#
#
# ### getopts命令的变量
# - $OPTARG变量保存选项的参数值;
# - $OPTIND变量保存原始$*中下一个要处理的选项位置;
# - $OPTIND初值为1,遇到不带参数的选项将“optind += 1”,遇到带参数的选项将“optind += 2”

Shell - 简明Shell入门13 - 用户输入(UserInput)的更多相关文章

  1. Shell - 简明Shell入门

    本文以示例和注释的方式,对Shell编程的基本知识点进行了总结和回顾,所有脚本均已做了基本的调试和验证. Shell - 简明Shell入门 01 - 第一个脚本 脚本的定义.执行方法以及echo命令 ...

  2. Shell - 简明Shell编程

    本文是对Shell脚本编程的总结和回顾,所有涉及的脚本均已做了基本的调试和验证. [toc] 测试环境信息 [root@CentOS7 ~]# uname -a Linux CentOS7 3.10. ...

  3. Shell - 简明Shell入门01 - 第一个脚本(HelloShell)

    示例脚本及注释 #!/bin/bash echo "hello shell!" # 打印字符串"hello shell!" echo "Date: & ...

  4. Linux - 简明Shell编程13 - 用户输入(UserInput)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 1 - arguments #!/bin/bash i ...

  5. Shell - 简明Shell入门14 - 操作符(Operator)

    示例脚本及注释 #!/bin/bash echo "No code, just some comments." # ### 通配符 # * 代表任意(0个或多个)字符 # ? 代表 ...

  6. Shell - 简明Shell入门09 - 重定向(Redirection)

    示例脚本及注释 #!/bin/bash pwd > 1.log # 输出重定向到指定文件 date 1> 1.log # ">"与"1>" ...

  7. Shell - 简明Shell入门04 - 判断语句(If)

    示例脚本及注释 #!/bin/bash var=$1 # 将脚本的第一个参数赋值给变量var if test $var # test - check file types and compare va ...

  8. Shell - 简明Shell入门02 - 变量(Variable)

    示例脚本及注释 #!/bin/bash v1=test-variable_123 # 全局变量 v2=12345 v3='This is a test!' # 赋值语句使用单引号或双引号可以包含空格 ...

  9. Shell - 简明Shell入门15 - 调试(Debug)

    示例脚本及注释 #!/bin/bash -x for filename in t1 t2 t3 do touch $filename.txt echo "Create new file: $ ...

随机推荐

  1. java笔记--问题总结

    1. 垃圾回收算法 标记-清除算法 标记-清除算法是最基本的算法,和他的名字一样,分为两个步骤,一个步骤是标记需要回收的对象.在标记完成后统一回收被标记的对象.这个算法两个问题.一个是效率问题,标记和 ...

  2. windows mysql绿色版配置

    MySQL绿色版安装 1.下载地址 https://dev.mysql.com/downloads/mysql/ 2.配置my.ini 文件 解压下载文件到指定目录.如: my.ini文件内容: [m ...

  3. 将项目部署到 github上(部署到码云操作一样,前提是有码云账号)

    来源:http://www.cnblogs.com/fengxiongZz/p/6477456.html 首先你需要自己的网页文件(俗称项目) 第一步:登录到Github上,新建一个repositor ...

  4. 使用PostSharp在.NET平台上实现AOP(转)

    出处:https://www.cnblogs.com/leoo2sk/archive/2010/11/30/aop-postsharp.html 摘要 本文首先介绍AOP(面向方面编程)的相关概念及理 ...

  5. hdu6351 2018 Multi-University Training Contest 5 1002 Beautiful Now

    题意: 给出一个十进制数,数位两两可以交换,给出最多能交换多少次,以及交换后的数不能有前缀0,问能形成最小和最大的数 * * * 尝试的思路 贪心,将字符串先排出最大以及最小的情况,然后按一定顺序将对 ...

  6. cyclone IV中DDR的一个疑惑

    的生成的DDR2 IP中DDR的时钟竟然是双向的,而在arria10中生成的DDR4则是输出,而DDR2的datasheet上也指出ck和ck#是输入,不知为什么? inout mem_clk , i ...

  7. Redis模块开发示例

    实现一个Redis module,支持两个扩展命令: 1) 可同时对hash的多个field进行incr操作: 2) incrby同时设置一个key的过期时间 在没有module之前,需要借助eval ...

  8. python计算机硬件基础以及变量常量常量池,解释器编译器比较,python的两种运行方式

    1.什么是编程语言 语言是一个事物与另外一个事物沟通的介质 编程语言是程序员与计算机沟通的介质 2.什么是编程 编程就是程序按照某种编程语言的语法规范将自己想要让计算机做的事情表达出来 表达的结果就是 ...

  9. Codeforces Round #540 (Div. 3)--1118D2 - Coffee and Coursework (Hard Version)

    https://codeforces.com/contest/1118/problem/D2 和easy version的主要区别是,数据增加了. easy version采用的是线性查找,效率低 在 ...

  10. Maven提高篇系列之五——处理依赖冲突

    个人分类: Maven 不知道你在使用Maven时是否遇到过诸如"NoSuchMethodError"或"ClassNotFoundException"之类的问 ...