linux学习(六) shell脚本(3)

转载 2013年12月02日 23:14:54

处理用户输入

1.命令行参数

       向shell脚本传送数据的最基本的方式是使用命令行参数。使用命令行参数可以在执行脚本的时候向命令行添加数据值。

./additem 10  30

1.1读取参数

      bash shell将在命令行中输入的参数赋值给一些特殊的变量,这些变量称为位置参数。其中程序名 为 $0, 之后的参数依次为 $1, $2, ....$0 实际上是程序的完成路径,而不仅仅是程序名。

1.2特殊的参数变量

      参数计数,即参数的个数 $#,其中不包括$0 的参数的个数,即位置参数的最大为$#, 表示最后一个命令行参数,用 ${!#}, 而不是使用 ${$#}.。

1.3获取所有命令行参数

    使用$* 和 $@, 其中$*将所有的命令行参数(除了 $0程序名之外),视为一个整体字符串; 而$@将所有的命令行参数(除了 $0程序名之外)视为一个输入参数列表。二者都可以直接被输出,$*输出全部的命令行参数, 而$@可以将其中的参数一个一个的取出。

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

done

////同样可以写成

count=1
until [ -z $1 ]
do
   echo "\$@ parameter #$count = $1"
   count=$[$count+1]
   shift
done

使用shift命令进行命令行参数的遍历:使用shift命令时,默认将每个参数左移一个位置,变量$1被丢掉, $#减去1, $0 保持不变。可以使用 shift n 来左移n个。

1.4 处理选项   使用getopt命令处理选项。 

getopt命令处理命令行选项和参数列表,并对命令行参数进行重新组织,以便于分析。getopt命令可以接受任意形式的命令行选项和参数列表,并自动将这些选项和参数转换为适当的格式,格式如下: getopt  options   optstring  parameters

getopt根据提供的选项字符串optstring提供的有效选项字母,然后在每个需要参数值的选项字母后面放一个冒号,getopt命令根据定义的选项字符串解析提供的参数。如:

$getopt ab:cd -a -b test1  -cd test2 test3  // getopt命令会对输入的命令行参数(不含$0)进行格式化。变得更易处理。

-a -b test1 -c -d -- test2 test3

其中的选项字符串定义了四个有效选项字母,a, b, c, d,还定义了字母 b 要有 一个参数值,解析时,getopt 命令将 -cd 选项分割成两个不同的选项,并插入双破折号来分隔行中的额外参数。如果指定的选项不包含在选项字符串中,getopt命令会默认生成一个错误信息。

1.5在脚本中使用getopt

在脚本中使用getopt命令格式化为脚本输入的任意命令行选项或参数。使用set命令。set命令的一个选项使用双破折号,表示将命令行参数变量替换为set命令的命令行中的值。这样,就可以将原始脚本命令行参数送给getopt命令,然后将getopt命令的输出送给set命令,以便将原始命令行参数替换为通过getopt格式化后的更精细的形式。

如下: set --`getopts -q ab:cd "$@"`

现在原始的命令行参数旧被替换成了getopt命令的输出,getopt命令将命令行参数进行了格式化。

set -- `getopt -q ab:c "$@"`
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 optoin";;
   --)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的使用格式,在要求有参数的-option之后要紧跟他的对应参数,其他parameters必须放在最后。getopt  options   optstring  parameters。 而且-option之后只能接一个参数。

getopt的缺陷是不能很好的处理含有空格的参数值,因为他会将空格视为参数与参数之间的分隔符,如 参数 "test1  test2" 会被分开。

1.6 getopts命令

getopt为在命令行中找到的所有待处理选项和参数生成一个输出,而与getopt不同,getopts命令顺序的对现有的shell参数变量进行处理。

每调用一次getopts,只处理在命令中检测到的参数中的一个。处理完所有参数后,以大于零的状态退出。因此,getopts非常适宜在循环中解析所有命令行参数。命令格式:

getopts  optstring variable

getopts中的optstring的值和getopt命令中使用的相似。在选项字符串中列出有效选项字母,如果选项字母需要参数值后面加一个冒号。如果要禁止输出错误消息,则使用选项字符串以冒号开头。getopts命令将当前参数放在命令行中定义的variable中。

getopts命令使用两个环境变量, OPTARG中包含需要参数值的选项要使用的值,OPTIND包含的值表示getopts停止处理时在参数列表中的位置。这样,处理完选项后可以继续处理其他命令行参数。

while getopts :ab:c opt
do
case "$opt" in
a) echo "Found the -a option";;
b) echo "Found the -b option, with value $OPTARG";;
c) echo "Found the -c option";;
*) echo "Unknown option: $opt";;
esac
done
shift $[ $OPTIND - 1 ]

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

done

getopts命令可以将 双引号或者单引号包围起来的含有空格的字符串视为一个参数。

getopts命令知道何时停止处理选项,将参数留给程序处理,getopts每个处理选项,环境变量OPTIND的值会加1, 当到达getopts处理的末尾,可以使用shift  命令和OPTIND 值进行操作来移动到参数。

标准化选项:创建脚本具有普遍的选项支持,更加友好。 linux中有一些字母选项具有某种特定的意义。如果在shell脚本中使用这些选项将使得脚本更加便于使用。

比如 -a 显示所有对象; -c 生成计数;  -d 指定目录; -i 忽略大小写等等。


1.7 获取用户输入

在shell执行期间获得用户的输入

(1)基本读取

read命令接受标准输入(键盘)的输入,或其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。

echo -n  "input your name:"   /////// -n  选项在echo后使用,是为了不换行。

read name

echo  “Hello  $name"


read -p  "input your name: "  name //也可以将上面的 echo -n  "input your name:"   ; read name换成这一句,-p是为了在获取输入之前先给一个提示。

read 命令将提示后面输入的所有数据赋值给单个变量,或者也可以指定多个变量。输入的每个数据值都被赋值到列表的下一个变量,如果列表中变量的数目小于输入的数目,则剩余的数据都赋值给最后一个变量(将多个分隔开的字符串视为一个整体)。

read -p "input your name:"  first  last   //希望输入两个变量值 fist 和last

如果在read后没有指定变量,则read将输入的变量都放到环境变量REPLY中。

(2)计时

-t 指定一个定时器,用来设置等待用户输入的时间(秒),如果超时没有输入,则继续执行。如果计时器计数满时,read命令返回一个非零退出状态。

read -t 60 -p "you have one minute to input, input your name: " name

(3) 设置read命令输入的字符

使用 -n 指定后面后面输入的有效字符数,将指定的字符数的字符赋值给变量。

(4)read 隐藏输入的字符

使用 -s 命令,在输入的时候将字符隐藏(显示为和shell背景相同的颜色)。


1.8 读取文件

每调用一次read命令,就会读取文件中的一行。当文件中没有数据可读的时候,read命令以非零的状态退出。

count=1
cat testfile | while read line
do
echo "Line $count: $line"
count=$[$count+1]
done
echo "Finished processing the file"







相关文章推荐

Linux学习笔记3-1:SHELL脚本

Linux系统的Shell环境允许用户通过交互式命令实现系统管理,同时用户还可以通过编写脚本文件实现执行过程完全自动化且功能更强大的系统管理工作,所以,相对于需要用户不断干预的命令行交互方式,脚本有着...
  • adkada1
  • adkada1
  • 2016年10月24日 08:57
  • 199

Linux shell脚本学习攻略笔记3

今天继续上一次find命令的内容,主要是find和 -exec 和xargs的结合和使用。      (9) find 命令可以借助选项-exec与其他命令进行结合。- exec算得上是find最强...
  • wwe4023
  • wwe4023
  • 2017年05月06日 12:38
  • 106

linux shell脚本攻略 学习笔记3 -- 第三章 以文件之名

linux shell脚本攻略 学习笔记3 -- 第三章 以文件之名,本章都是与文件处理相关的知识。...
  • hrl19
  • hrl19
  • 2015年07月09日 21:24
  • 240

Linux学习3_学习shell脚本前应具备的基础知识

日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员。目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目。有的单位...

《linux命令行与shell脚本编程大全》第三版 - 核心笔记(3/4):sed和gawk

《linux命令行与shell脚本编程大全》 全书4部分: ☆ 【1】linux命令行(1-10章) ☆ 【2】shell脚本编程基础(11-16章) ☆ 【3】高级shell脚本编程(17-...

《linux命令行与shell脚本编程大全》第三版 - 核心笔记(3/4):正则表达式

《linux命令行与shell脚本编程大全》 全书4部分: ☆ 【1】linux命令行(1-10章) ☆ 【2】shell脚本编程基础(11-16章) ☆ 【3】高级shell脚本编程(17-...

Linux新手生存笔记[10]——shell脚本基础3-函数及常用命令

回到全局目录 ----------------------------------------------- 目录 函数定义 1 退出状态 1 参数传递 2 标准IO 2 脚本调试 2 AND&OR ...
  • wklken
  • wklken
  • 2012年05月05日 11:40
  • 4087

linux-shell脚本学习

  • 2014年07月07日 19:08
  • 168KB
  • 下载

Linux shell脚本全面学习

  • 2011年05月18日 09:34
  • 22KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux学习(六) shell脚本(3)
举报原因:
原因补充:

(最多只允许输入30个字)