shell 与用户交互

时间:2022-09-02 10:39:23

bash shell如何获取命令行参数(添加到命令后的数据)、命令行选项(确定命令行为的英文字母)、键盘输入数据

操作命令行参数

1 读取参数

bash shell用位置参数变量(positional parameter)存储命令行输入的所有参数,包括程序名。其中,$0表示程序名,$1表示第1个参数,$2表示第2个参数,...,$9表示第9个参数。如果参数个数多于9个,必须如下表示变量:${},${},...
for((count = ; count <= $; count++))
do
echo The number is $count.
done
shell 与用户交互 echo $1, $2, $10, $15
shell 与用户交互

2 读取程序名

首先想到的是利用$,但是$0获取的文件名包括./以及路径等前缀信息,如下:
echo The command entered is: $
# 运行:./
# 输出:The command entered is: ./.sh
如果想仅得到文件名,而不包含./,可以使用basename命令:
name=`basename $`
echo The command entered is: $name
# 运行:./
# 输出:The command entered is: .sh

3 特殊变量

$#表示命令行参数的个数:
params=$#

echo The number of params is: $params
for((i = ; i <= params; i++))
do
echo The param is: $i
done
shell 与用户交互
那么很自然地,${$#}表示最后一个变量的值,如下程序:
params=$#
echo The number of params is: $params
echo The last parameter is: ${$#}

shell 与用户交互

这是怎么回事呢?原来在花括号内不能使用$符号,而是以!来代替$工作:
params=$#
echo The number of params is: $params
echo The last parameter is: ${!#}

shell 与用户交互

如果想获取所有的参数,当然可以利用$#和循环逐个遍历。也可以利用如下两个特殊变量:$*将所有的命令行参数看作一个整体存储,而$@将命令行中以空格间隔的参数单独存储,如下:
count=
for param in "$*"
do
echo "\$* parameter $count = $param"
count=$[ $count + ]
done count=
for param in "$@"
do
echo "\$@ parameter $count = $param"
count=$[ $count + ]
done
shell 与用户交互

4 移动变量命令shift

shift命令用于将后一个变量的值移到前一个变量上,即$3的值移到$2,$2的值移到$1,$1的值被删除。
注:变量$0的值不会被替换。该命令可以使得在不需要知道有多少个参数的情况下即可遍历所有参数:
count=
while [ -n "$1" ]
do
echo "parameter $count = $1"
count=$[ $count + ]
shift
done
shell 与用户交互

注:使用shift命令移除的参数值是无法恢复的,也可以使用shift移到多位,如:shift 2。

shell 与用户交互

操作命令行选项

1 查找选项

可以判断命令行参数是否存在有效选项:

#! /bin/bash
# extracting command line options as parameters while [ -n "$1" ]
do
case "$1" in
-a)
echo "found the -a option";;
-b)
echo "found the -b option";;
-c)
echo "found the -c option";;
*)
echo "$1 is not an option";;
esac
shift
done
shell 与用户交互

在Linux中,命令行选项和参数的分离使用--符号,shell将--前边的参数作为选项来处理。如下脚本可以有效地分离出选项和参数:

#! /bin/bash
# extracting command line options as parameters while [ -n "$1" ]
do
  case "$1" in
  -a)
    echo "found the -a option";;
  -b)
    echo "found the -b option";;
  -c)
    echo "found the -c option";;
  --)
    break;;
  *)
    echo "$1 is not an option";;
  esac
  shift
done shift # 确保跳出while循环后,将--符号移除掉
count=
for param in $@
do
echo "parameter $count: $param"
count=$[ $count + ]
done
shell 与用户交互

如何处理带有参数值的选项呢?比如,./22.sh -a -b benxin -c -d

#! /bin/bash
# extracting command line options as parameters while [ -n "$1" ]
do
case "$1" in
-a)
echo "found the -a option";;
-b)
param="$2"
echo "found the -b option with parameter value $param"
shift ;;
-c)
echo "found the -c option";;
--)
shift
break;;
*)
echo "$1 is not an option";;
esac
shift
done count=
for param in "$@"
do
echo "parameter $count: $param"
count=$[ $count + ]
done
shell 与用户交互

合并选项时可以使用getopt命令,格式如下:

getopt options optstring parameters

options定义了命令行中有效的选项字母以及哪些选项字母需要附加参数值等(在需要附加参数值的选项字母后加一个冒号),如getopt ab:cd -a -b benxin -cd tuzi benxintuzi,optstring定义了4个有效字母:a、b、c、d,并且说明了选项b需要附带参数值。getopt命令自动将-cd拆分成-c和-d两个选项,并且用双破折号--隔开命令行中的额外参数。

shell 与用户交互

2 选项的标准化约定

选项

说明

-a

显示所有对象

-c

生成一个计数

-d

指定一个目录

-e

扩展一个对象

-f

指定输入文件

-h

显示命令帮助

-i

忽略文本大小写

-l

产生输出的长格式版本

-n

使用非交互模式(批量)

-o

指定输出文件

-q

以安静模式运行

-r

递归处理目录或文件

-s

以安静模式运行

-v

生成详细输出

-x

排除某个对象

-y

对所有问题回答yes

操作键盘输入

1 基本的读取

read命令接受从键盘或文件描述符中的输入数据,将其存储到一个指定变量中。使用-p选项可以指定输入提示信息,如下所示:

#! /bin/bash
# testing the read option read -p "Please enter your name: " name
echo "Hello $name."
shell 与用户交互

read命令中,可以根据需要将输入的数据保存在多个变量中,如果指定的变量比较少,那么最后一个变量将包含余下的所有输入,如下所示:

#! /bin/bash
# testing the read option read -p "Enter the values: " val1 val2 val3
echo "$val1"
echo "$val2"
echo "$val3"
shell 与用户交互

注:如果使用read命令时不指定变量,那么read将其接收的任何数据都放到环境变量REPLY中。

2 输入超时

使用read命令时,脚本会一直等待用户输入数据,如果想设置等待时间,使用-t选项即可指定一个计时器,当计时器超时后,read命令会返回一个非零状态码。

if read -t  -p "Please enter your name: " name
then
echo "Hello $name."
else
echo
echo "Sorry, too slow"
fi

3 隐藏输入显示

当输入敏感信息时,比如密码,不希望显示在屏幕上,那么可以使用read的-s选项,-s选项的功能是将输入文本颜色设置为与背景色一样:

#! /bin/bash
# testing the read option read -s -p "Enter your password: " passwd
echo
echo "Is your password really $passwd?"
shell 与用户交互

4 从文件中读取

read每次从文件中读取一行数据,当文件中没有数据时,read命令返回非零状态码。最常见的方法是将cat命令运行后的结果通过管道传给含有read的while语句,如下:

#! /bin/bash
# testing the read option count=
cat .sh | while read line
do
echo "Line $count: $line"
count=$[ $count + ]
done echo "Finished processing the file"
shell 与用户交互

shell 与用户交互的更多相关文章

  1. shell脚本0——”一切皆文件&OpenCurlyDoubleQuote;, 认识Shell

    一.”一切皆文件“与“管道” 1)管道:grep foo /path/to/file | grep -n -k 3 | more 实际过程与我们直观认为的相反,最好通过实际过程理解.首先运行的是mor ...

  2. adb shell 查看当前与用户交互的 activity

    adb shell dumpsys activity activities | grep mActivityComponent

  3. shell笔记

    shell:俗称操作系统的"外壳",就是命令解释程序.     是用户与Linux内核之间的接口.     是负责与用户交互,分析.执行用户输入的命令,并给出结果或出错提示.    ...

  4. Linux shell脚本编程&lpar;一&rpar;

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  5. 终端、shell、bash的区别联系

    最佳答案 终端,即所谓的命令行界面,又称命令终端,用户输入shell命令用的窗口,跟Windows里的DOS界面差不多. shell,Shell就是用户和操作系统之间的壳,中介,GUI和CLI都算是S ...

  6. 【Linux】Shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  7. Shell 常见理论问答

    (1)shell脚本中,怎么可以把某一行注释掉? 答:“#”. (2)如何执行一个shell脚本呢? 答:“sh x.sh”,“加执行./x.sh”,“bash x.sh”. (3)为了方便管理我们约 ...

  8. Linux下的shell与make

    Linux下的shell与make 一.shell 1.1 什么是shell ● 用户与Linux的接口 ● 命令解释器 ● 支持多用户 ● 支持复杂的编程语言 ● Shell有很多种,如:csh,t ...

  9. Shell编程-01-Shell脚本初步入门

    目录 什么是Shell 什么是Shell脚本 Shell脚本语言的种类 常用操作系统默认Shell Shell 脚本的建立和执行 脚本规范 什么是Shell     简单来说Shell其实就是一个命令 ...

随机推荐

  1. Navicat安装详解

    本文章介绍MySql图形化操作软件Navicat的安装 属于PHP环境搭建的一部分. PHP完整配置信息请参考 http://www.cnblogs.com/azhe-style/p/php_new_ ...

  2. Android — Camera聚焦流程

    原文  http://www.cnphp6.com/archives/65098 主题 Android Camera.java autoFocus()聚焦回调函数 @Override public v ...

  3. struts2文件下载,动态设置资源地址

    转自:http://blog.csdn.net/ctrl_shift_del/article/details/6277340 ServletActionContext.getServletContex ...

  4. javascript 判断身份证的正确性

    function isIdCardNo(vals) { var cardNum = vals; if (cardNum.length == 0) { return true; } // 11-15,2 ...

  5. &lpar;Deep&rpar; Neural Networks &lpar;Deep Learning&rpar; &comma; NLP and Text Mining

    (Deep) Neural Networks (Deep Learning) , NLP and Text Mining 最近翻了一下关于Deep Learning 或者 普通的Neural Netw ...

  6. POJ 1185 (状态压缩DP)

    中文题目,题意就不说了. 不得不说这是一道十分经典的状态压缩DP的题目. 思路: 通过分析可以发现,第i行的格子能不能放大炮仅与第i-1和i-2行的放法有关,而与前面的放法无关,因此,如果我们知道了i ...

  7. vue&period;js基础知识篇&lpar;1&rpar;&colon;简介、数据绑定

    目录第一章:vue.js是什么? 第二章:数据绑定第三章:指令第四章:计算属性第五章:表单控件绑定代码链接: http://pan.baidu.com/s/1qXCfzRI 密码: 5j79 第一章: ...

  8. Synergy简单使用小记

    需求: 两台笔记本用两套键盘鼠标,那体验,糟透了. 怎样才能使得两个主机公用一套鼠标和键盘呢?上网搜索到Synergy这款软件 参考: 具体使用方法参考了这篇博文 基本使用: 这款软件分为服务端和客户 ...

  9. ORACLE——存储过程

    存储过程procedure 被内容来自<oracle从入门到精通——明日科技>一书 存储过程是一种命名的PL/SQL程序快,存储过程被保存在数据库中,它不可以被SQL语句直接执行或调用,只 ...

  10. 【Maven】Project configuration is not up-to-date with pom&period;xml错误解决方法

    导入一个Maven项目之后发现有一个如下的错误: Project configuration is not up-to-date with pom.xml. Run project configura ...