shell 与用户交互

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: ${!#}

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

count=1
for param in "[email protected]"
do
    echo "\[email protected] 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 [email protected]
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 "[email protected]"
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"
时间: 2024-08-12 13:53:20

shell 与用户交互的相关文章

linux第2天复习

操作系统基础 操作系统是以内核(kernel)为核心的软件,它对计算机硬件作首次扩充和改造,主要完成资源的调度和分配,信息的存取和保护,并发活动的协调和控制等许多工作.操作系统功能主要有:处理器管理,存储管理,设备管理,文件管理,作用管理,网络与通信管理,安全机制...... 操作系统通过shell与用户交互,shell是整个操作系统的外壳,接受用户指令,理解用户命令,并传输给内核.广义上来讲,shell包含界面shell和命令行shell.GUI是指图形用户界面,而CLI指的是命令行界面,它们

Linux mysql shell脚本 变量和环境变量 位置参数 预定义变量 运算符 判断 流程控制 for循环 与用户交互 函数

mysql 1. 卸载旧版本 rpm -qa | grep mysql 检查是否有旧版本 查询结果:mysql-libs-5.1.73-7.el6.x86_64 rpm -e mysql-libs 删除旧版本 rpm -e --nodeps mysql-libs 强行删除 2. 安装mysql 2.1 安装源码需要编译 下载c的编译工具 yum -y install make gcc-c++ cmake bison-devel ncurses-devel 2.2 xftp连接上传 xftp连接上

Linux Shell

Shell是一个系统程序,但与一般在后台运行的系统程序不同,它在前台提供Linux系统与用户交互操作的界面. 一.Shell变量 1.本地变量 本地变量是由用户自己定义,只作用于当前的shell环境,对于在这个shell环境下启动的子shell进程,它将不能够被有效访问. (1)设置变量 例:MOVIE="Live is beautiful" (2)显示变量 例:echo $MOVIE (3)清除变量 例:unset MOVIE (4)查看所有变量 例:set|more 2.环境变量

Linux Shell编程之二选择结构

Shell编程学习之二 一.bash的条件测试 测试方法或者说测试书写: test EXPR [ EXPR ] [[ EXPR ]] 例如:测试变量 User_Name 的之是否为root test $User_Name="root" [ $User_Name == "root" ] [[ $User_Name == "root" ] 根据比较时操作数的类型,测试类型分为: 测试类型 运算符 运算符所代表的意义 示例 整形测试 -gt -lt -

Shell脚本编程与sed,awk工具的使用--9月15日课程作业

一.shell程序的运行原理 1.脚本 脚本或程序源文件是一种文本文件,将文本文件转换成机器指令有两种转换方式: 编译执行:预处理-->编译-->汇编-->链接:事先完成,结果:二进制程序文件 例如:C, C++ 解释执行:由解释器全程参与运行过程,每次读取一行,运行一行: 例如:  Python:程序控制结构,调用编程库完成程序编写: 库文件:功能模块,在编程中可调用: Bash:调用机器上命令程序文件进行程序编写: 外部命令:各应用程序提供: 2.原理 当shell运行一个程序时,会

shell脚本小练习

说明: 最近写了一些简单的小脚本,用到了一些逻辑判断语句.个人感觉挺好玩的,拿来跟大家分享下.同时也会做一些解释说明 脚本代码可能还有待优化,如果有冗余或者错误的地方还请批评指正. 目录: 条件判断语句 1.1 if语句 1.1.1示例 1.2 case语句 1.2.1示例 循环语句 2.1 for语句 2.1.1 for语句一 2.1.2 for语句二 2.1.3示例 2.2 while语句 2.2.1示例 2.3 until语句 2.3.1示例 2.4 特殊语句(break.无限循环.sel

终端、shell、bash的区别联系

最佳答案 终端,即所谓的命令行界面,又称命令终端,用户输入shell命令用的窗口,跟Windows里的DOS界面差不多. shell,Shell就是用户和操作系统之间的壳,中介,GUI和CLI都算是Shell,登陆终端可以是登陆了Bash也可能是Csh或者Dash:是操作系统与用户交互用的接口,在命令终端里可以使用shell.shell将用户输入翻译为操作系统能处理的指令.shell提供了一些内置命令,也支持调用外面工具. dash,是ubuntu里默认的shell.shell有好多种,除支持默

Shell脚本编程及示例和例题解析

Shell脚本的说明: shell脚本编程,实际上就是用vim编辑器编辑一个以.sh为结尾的脚本文件,在此脚本文件中使用Linux内部的一个或多个命令,通过编程语言以脚本运行的方式,一次性运行一次一个.一次多个或多次多个命令进行运算,并输出结果,及添加直观的注释. Shell脚本的编辑标准格式: 使用vim编辑器编辑一个自定义创建的文件名并以.sh格式结尾->    #!/bin/bash    #    脚本主体  \\脚本主体可直接编辑输入参数.命令.函数.shell编程语言等.且脚本主体所

Linux shell的条件判断、循环语句及实例

shell条件判断的两个特殊设备 /dev/null linux系统的空设备,也称为位桶,任何写入其中的数据均会被丢弃当你不想将标准化输出显示或者保存至文件时可以将文件从定向到/dev/null 禁止标准化输出 cat $filename > /dev/null 禁止标准化错误 rm $filename > /dev/null /dev/zero Linux的输入设备,可以用他初始化文件,可以无限制输出0, 另一个作用是用0去填充一个指定大小的文件 在条件判断语句中&&表示an