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下shell脚本学习

在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shel...
  • whatday
  • whatday
  • 2016年03月25日 10:42
  • 3382

Shell脚本初步学习-鸟哥Linux私房菜基础学习篇

Shell脚本对于Linux下的系统管理员和运维的人来说很重要。最近看了一下Shell脚本,为了系统地学习一下Shell脚本,我看了一下《鸟哥的Linux私房菜基础学习篇》第三版,其中的第13章讲了一...
  • ccf19881030
  • ccf19881030
  • 2013年05月14日 23:19
  • 4834

书写优雅的shell脚本(三) - shell中exec解析

参考:《linux命令、编辑器与shell编程》 《unix环境高级编程》     exec和source都属于bash内部命令(builtins commands),在bash下输入ma...
  • xyls12345
  • xyls12345
  • 2014年05月14日 00:49
  • 3489

Shell脚本学习笔记

Shell学习笔记Shell学习笔记 简介 Shell教程入门 1shell脚本 2shell脚本实践 Shell变量 1使用变量 2只读变量 3删除变量 4变量类型 5shell字符串 6Shell...
  • binglumeng
  • binglumeng
  • 2016年11月18日 19:37
  • 1336

Shell脚本学习(一)Shell命令基础

Shell脚本学习(一)Shell命令基础
  • birdben
  • birdben
  • 2016年08月08日 23:55
  • 17048

Linux Shell脚本小程序不定时更新

我觉得Linux比windows好,在这个系统上我找到了久违的激情。我觉得shell和批处理是一个类似的语言(我没用过批处理但是有一种感觉),但是shell用着更爽,linux稳定执行快,就是语法略烦...
  • cdxiaodai
  • cdxiaodai
  • 2013年11月29日 16:09
  • 1344

shell 脚本 学习案例解析

昨天大约花了一天的功夫整理了一些shell脚本语言中语法知识,顺便写了很多的案例,分享给大家!...
  • u013011270
  • u013011270
  • 2014年02月22日 10:31
  • 1631

shell脚本学习10——函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,Shell 也支持函数。Shell 函数必须先定义后使用。 Shell 函数的定义格式如下...
  • Watson2016
  • Watson2016
  • 2016年08月30日 12:40
  • 539

《Power Shell高级编程》学习:第1章 PowerShell简介

Windows PowerShell设计原则 Windows PowerShell快速入门 直接双击 Windows PowerShell 快捷方式或者在“运行”对话框中输入 “PowerShell”...
  • yenange
  • yenange
  • 2016年05月26日 15:21
  • 2204

shell脚本应用小程序

1...100的求和 非递归:   #!/bin/bash  read num  count=1  sum=0  val=""  ret=""  whi...
  • chengxuyuanyonghu
  • chengxuyuanyonghu
  • 2017年02月11日 07:04
  • 1191
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux学习(六) shell脚本(3)
举报原因:
原因补充:

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