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

来源:互联网 发布:中国人现实 知乎 编辑:程序博客网 时间:2024/06/01 09:59

处理用户输入

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"







原创粉丝点击