shell 与用户交互

2023-11-16

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

操作命令行参数

1 读取参数

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

 

2 读取程序名

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

3 特殊变量

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

 

params=$#

echo The number of params is: $params
for((i = 1; i <= params; i++))
do
    echo The param is: $i
done
 

 

那么很自然地,${$#}表示最后一个变量的值,如下程序:
params=$#
echo The number of params is: $params
echo The last parameter is: ${$#}

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

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

count=1
for param in "$@"
do
    echo "\$@ parameter $count = $param"
    count=$[ $count + 1 ]
done
 

 

4 移动变量命令shift

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

 

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

 

操作命令行选项

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
 

 

在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=1
for param in $@
do
        echo "parameter $count: $param"
        count=$[ $count + 1 ]
done
 

 

如何处理带有参数值的选项呢?比如,./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 2;;
    -c)
        echo "found the -c option";;
    --)
        shift
        break;;
    *)
        echo "$1 is not an option";;
    esac
    shift
done

count=1
for param in "$@"
do
    echo "parameter $count: $param"
    count=$[ $count + 1 ]
done
 

 

合并选项时可以使用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两个选项,并且用双破折号--隔开命令行中的额外参数。

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."
 

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

#! /bin/bash
# testing the read option

read -p "Enter the values: " val1 val2 val3
echo "$val1"
echo "$val2"
echo "$val3"
 

 

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

2 输入超时

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

 

if read -t 5 -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?"
 

 

4 从文件中读取

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

#! /bin/bash
# testing the read option

count=1
cat 25.sh | while read line
do
    echo "Line $count: $line"
    count=$[ $count + 1 ]
done

echo "Finished processing the file"
 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell 与用户交互 的相关文章

随机推荐

  • 换盘符cd的用法

    如果是在本盘内切换文件夹 直接使用cd 后面跟地址即可 如果是跨区切换地址 cd 后面就需要跟 d 斜杠d d就代表着跨分区切换地址 cd d d C ProgramData Anaconda3 Scripts gt cd d d d gt
  • linux之查看端口占用

    第一章 linux之帮助命令 第二章 linux命令行快捷键 第三章 linux之防火墙 第四章 linux之服务开机自启 第五章 linux之关机与重启 第六章 linux之环境变量 第七章 linux之目录操作命令 第八章 linux之
  • esp8266与stm32、手机通讯(原子云)——hal库(有代码)

    本文所讲 正点原子的wifi模块esp8266与正点原子开发板战舰V3 stm32f103zet6 及手机app通讯 esp8266分为三种工作模式 STA 8266连接到网络比如wifi 手机热点等 AP 8266作为热点 由手机连接到8
  • 规则引擎Drools使用 第二篇Drools规则引擎介绍

    Drools规则引擎介绍 drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎 可以将复杂且多变的业务规则从硬编码中解放出来 以规则脚本的形式存放在文件或特定的存储介质中 例如存放在数据库中 使得业务规则的变更不需要修
  • Idea自带的http client工具使用攻略

    平时都是用postman来调接口 有时候也会用到swagger 用swagger还可以 直接在浏览器上开个页面即可 但是postman就不行了 需要单独的运行 个人感觉postman还是比较占内存的 最近和一个其他组同事联调 发现他们使用的
  • python跳出for循环

    一 问题描述 在二维数组的遍历中 我们经常使用双层for循环 在某些时候 我们并不需要遍历整个二维数组 当条件满足时就应该终止for循环 但是 直接在内层循环中break并不会让外层循环也终止 二 解决方案 使用for else 语法解决
  • STM32的烧录和Hex/bin烧录文件解析、烧录文件是被如何存储到MCU中的?

    什么是hex文件 以 hex为后缀的文件我们称之为HEX文件 hex是intel规定的标准 hex的全称是Intel HEX 此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据 是由一行行符合Intel HEX文件格式的文本所构
  • OpenWRT中的按键和灯的GPIO控制实现

    原文地址 点击打开链接 基于BarrierBreaker版本 基于AR9331 AP121 Demo单板 来进行描述 1 灯 A 在mach ap121 c中 定义了灯所对应的GPIO定义 define AP121 GPIO LED WLA
  • 详解以太坊的工作原理

    这篇文章主要讲解以太坊的基本原理 对技术感兴趣的朋友可以看看 翻译作者 许莉 原文地址 How does Ethereum work anyway 简介 不管你们知不知道以太坊 Ethereum blockchain 是什么 但是你们大概都
  • [机器学习入门笔记] 3. 监督学习单模型部分

    文章目录 前言 1 机器学习预备知识 1 1 关键术语与任务类型 1 2 机器学习三要素 1 3 机器学习的核心 1 4 机器学习流程 第 2 章 线性回归 2 1 线性回归的原理推导 2 2 线性回归的代码实现 2 2 1 基于Numpy
  • 网站反爬虫requests获取不到数据怎么办?

    import requests import re content requests get https blog csdn net seanyang type blog headers content decode 想通过requests
  • HackerRank Triangle Quest 2

    给你一个正整数n 例如n 5 则输出 1 121 12321 1234321 123454321 思路 这就是1 11 111 1111 的平方 题目不让用字符串做 或者代码不能超过一行见代码 for i in range 1 int in
  • JSON与JAVA数据的相互转换

    先做个记号 JSON与JAVA数据的相互转换
  • MySQL中的事务

    系列文章目录 MySQL常见的几种约束 MySQL中的函数 文章目录 系列文章目录 前言 一 事务及其特征 1 事务的概念 2 事务的特性 1 原子性 2 一致性 3 隔离性 4 持久性 二 事务并发问题 1 脏读 Dirty read 2
  • html.4

    一 表格的结构标签 可以确定表格在浏览器中的位置 htead 代表表格的头部 tbody 代表表格的主体 tfoot 代表表格的尾部 shift alt 鼠标 选中没以后的相同位置
  • c++ char数组转string

    代码 char数组的路径转string的路径 void charArrayPath2string char char array path MAX PATH std string string path std stringstream s
  • Shell脚本函数应用

    记录 429 场景 Shell脚本函数应用 定义函数 函数调用 函数传参 版本 CentOS Linux release 7 9 2009 1 普通函数 示例普通函数是没有入参和返回值 1 1脚本 脚本名称 b2023051701 sh 脚
  • Android基础知识(二)简单控件

    一 文本显示 考虑到结构样式相分离的思想 我们往往在XML中设置文本
  • ABAP 向上取整和向下取整 CEIL & FLOOR

    ls taba 2 zjybs floor lv zlssl ls taba 2 bstrf 向上取整 CEIL 改为向下取整 FLOOR DATA a TYPE mseg menge b TYPE mseg menge c TYPE ms
  • shell 与用户交互

    bash shell如何获取命令行参数 添加到命令后的数据 命令行选项 确定命令行为的英文字母 键盘输入数据 操作命令行参数 1 读取参数 bash shell用位置参数变量 positional parameter 存储命令行输入的所有参