##1.处理输入的几种方法 输入可以是命令行输入,也可以是读取文件,也可以用read。如果想找个直接简单一点的,建议直接跳到read命令那里去。
####1.命令行参数 举例
./addem 10 30 #向脚本传递两个命令行参数 10 和 30
一个简单的带命令行参数的脚本(test2.sh)
#!/bin/bash#total=$[ $1 + $2 ]echo "The first parameter is $1."echo "The second parameter is $2"echo "The total value is $total."
在命令行中输入:
./test2.sh 2 5
得到结果:
The first parameter is 2.
The second parameter is 5.
The total value is 10.
- 命令行中的第一个参数就是$1,第二个是$2 ,以此类推……若在脚本中使用只需要引用$1等就可以了
- 如果需要用到的命令行参数多于9个的话,需要加花括号,如:${10}是第十个参量
- 使用$0,可以读取脚本名(包括完整路径),所以我们有一个basename的命令,直接获取脚本名
#!/bin/bashname=$(basename $0)echoecho "The script name is: $name"
- 如果运行需要有输入的脚本但却没有输入的话,会报错,所以使用时要注意检查数据是否存在
#!/bin/bashif [ -n "$1" ] # 检查$1是否存在then echo "Hello $,glad to meet you"else echo "Sorry, you did not identify yourself"fi
- 输入的参数可以是字符串,但一定要加双引号(或单引号)。因为如果中间有空格的话,shell会把字符串当成多个参数
####2.特殊的参数变量 $#, $*, $@ $# 用来表示这个命令行中有多少个参数
- 不能在花括号中使用美元符号,既${$#}是不存在的
- 用${!#} 可以表示最后一个参数(但仅仅在这里有效,花括号里的美元是不是都能变成感叹号呢?这是个问题)
$* 将命令行上所有的参数保存成一个字符串
$@ 将命令行上所有的参数保存成独立的单词
#!/bin/bash#一个例子#echocount=1#for param in "$*"do echo "\$* Parameter #$count = $param" count=$[ $count + 1 ]done#echocount=1#for param in "$@"do echo "\$@ Parameter #$count = $ param" count=$[ $count + 1 ]done
运行:./test12.sh a b s d
$* Parameter #1 = a b s d $@ Parameter #1 = a$@ Parameter #2 = b$@ Parameter #3 = s$@ Parameter #4 = d#可见用$@遍历变量是个非常好的办法
####3.移动变量 shift shift 就是向左移动一个变量 $2变成$1,$3变成$2,而$1则被删除 例:
#!/bin/bash#echocount=1while [ -n "$1" ] #判断$1还存不存在do echo "Parameter #$count = $1" count=$[ $count + 1 ] shift #向左移动一格done
输出结果(与上面的一样,但是原理不一样):
Parameter #1 = aParameter #2 = bParameter #3 = sParameter #4 = d
####4.处理选项 (- -- 以及getopt,getopts) 选项呢,就是 - (单扩折号)后面跟着单个字母 一个例子:
#!/bin/bash#用case命令写的,基本解释了命令行中选项的原理(-a 只是习惯,用case的话什么都可以当选项)echowhile [ -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 shiftdone
那么,如何分离选项和参数呢? 使用双括折号
#!/bin/bash#用break跳出循环,再用shift将 -- 移出参数echowhile [ -n "$1" ]do case "$1" in -a) echo "Found the -a option";; -b) echo "Found the -b option";; -c) echo "Found the -c option";; --) shift break;; *) echo "$1 is not an option";; esac shiftdone#count=1for param in $@do echo "Parameter #$count: $param" count=$count[ $count + 1]done
另一种情况:含有带参数的选项
#!/bin/bash#处理到-b的时候,显然$2位置就是-b的参数所在的位置。(也就是说我们一定要知道参数的位置在哪,否则会有问题)echowhile [ -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 option";; --) shift break;; *) echo "$1 is not an option";; esac shiftdone#count=1for param in $@do echo "Parameter #$count: $param" count=$count[ $count + 1]done
- 使用getopt:一种神奇的格式,可以格式化命令行参数
输入:getopt ab:cd -a -b test1 test2 test3输出:-a -b test1 -c -d -- test2 test3#b后面有冒号说明b是带有选项的 ##如何在脚本中使用set -- $(getopt -q ab:cd "$@") #脚本中加上这一条,脚本就会自动格式化输入,如-ac可以识别成-a -c##但是getopt不能处理带空格和引号的参数值,它会把空格当分隔符
- getopts 可以处理变量的格式
#!/bin/bash#echowhile getopts :ab:c opt #选项前的:去掉错误信息,选项后的:用来表示有参数do case "$opt" in a) echo "Found the -a option";; #注意,这里不需要 - 了 b) echo "Found the -b option,with value $OPTARG" ;; # $OPTARG 存储了那个参数变量 c) echo "Found the -c option";; *) echo "Unknown option: $opt";; esacdone###运行(./test19.sh -ab test1 -c)后的结果echo "Found the -a option"echo "Found the -b option,with value test1"echo "Found the -c option"
####5.标准化选项 Linux对于选项有一个统一的标准,建议写脚本时尽量靠拢这个标准
标准见原书p305
####6.read ,获取用户输入 讲道理,这个应该是最好玩的,在苹果店里无聊的时候,可以用它来写个文字冒险游戏之类的玩玩,或者炫耀一下。当然,前提是要熟悉Linux命令,不然会翻车的,不要问我怎么知道的……
#!/bin/bash#read -p "Enter your name " name #-p用来实现在命令后面输入(所以搞点空格会看起来比较舒服),输入会保存在name这个变量中echoecho "welcome $name"##运行./test22.shEnter your name yuezhongmou##welcome yuezhongmou
- read支持依次输入多个变量哦
- 如果在脚本中没有指定变量的话,read会将变量存到REPLY
#一些选项-tread -t 5 -p "Enter your name: " name #五秒内输入,不然返回非零状态码(否)#-n1read -n1 -p "Do you want to continue [Y/N]" answer #输入一个字符(n1)就自动退出,也可以有n2,n7等#-s read -s -p “Enter your password: ” pass #将输入的数据的颜色变为和屏幕背景一样,所以Linux输入密码是看不出来的。这个设计很有想法!
- 可以利用read读取文件中的文本(利用油管)
#!/bin/bash#count=1cat test | while read line #cat读一行,echo输出一行do echo "Line $count: $line" count=$[ $count + 1 ]doneecho "Finished processing the file"