##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/bash
name=$(basename $0)
echo
echo "The script name is: $name"
- 如果运行需要有输入的脚本但却没有输入的话,会报错,所以使用时要注意检查数据是否存在
#!/bin/bash
if [ -n "$1" ] # 检查$1是否存在
then
echo "Hello $,glad to meet you"
else
echo "Sorry, you did not identify yourself"
fi
- 输入的参数可以是字符串,但一定要加双引号(或单引号)。因为如果中间有空格的话,shell会把字符串当成多个参数
####2.特殊的参数变量 $#, $*, $@ $# 用来表示这个命令行中有多少个参数
- 不能在花括号中使用美元符号,既${$#}是不存在的
- 用${!#} 可以表示最后一个参数(但仅仅在这里有效,花括号里的美元是不是都能变成感叹号呢?这是个问题)
$* 将命令行上所有的参数保存成一个字符串
$@ 将命令行上所有的参数保存成独立的单词
#!/bin/bash
#一个例子
#
echo
count=1
#
for param in "$*"
do
echo "\$* Parameter #$count = $param"
count=$[ $count + 1 ]
done
#
echo
count=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
#
echo
count=1
while [ -n "$1" ] #判断$1还存不存在
do
echo "Parameter #$count = $1"
count=$[ $count + 1 ]
shift #向左移动一格
done
输出结果(与上面的一样,但是原理不一样):
Parameter #1 = a
Parameter #2 = b
Parameter #3 = s
Parameter #4 = d
####4.处理选项 (- -- 以及getopt,getopts) 选项呢,就是 - (单扩折号)后面跟着单个字母 一个例子:
#!/bin/bash
#用case命令写的,基本解释了命令行中选项的原理(-a 只是习惯,用case的话什么都可以当选项)
echo
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
那么,如何分离选项和参数呢? 使用双括折号
#!/bin/bash
#用break跳出循环,再用shift将 -- 移出参数
echo
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";;
--) shift
break;;
*) echo "$1 is not an option";;
esac
shift
done
#
count=1
for param in $@
do
echo "Parameter #$count: $param"
count=$count[ $count + 1]
done
另一种情况:含有带参数的选项
#!/bin/bash
#处理到-b的时候,显然$2位置就是-b的参数所在的位置。(也就是说我们一定要知道参数的位置在哪,否则会有问题)
echo
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 option";;
--) shift
break;;
*) echo "$1 is not an option";;
esac
shift
done
#
count=1
for 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
#
echo
while 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";;
esac
done
#
#
#运行(./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这个变量中
echo
echo "welcome $name"
#
#运行./test22.sh
Enter your name yuezhongmou
#
#welcome yuezhongmou
- read支持依次输入多个变量哦
- 如果在脚本中没有指定变量的话,read会将变量存到REPLY
#一些选项
-t
read -t 5 -p "Enter your name: " name #五秒内输入,不然返回非零状态码(否)
#
-n1
read -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=1
cat test | while read line #cat读一行,echo输出一行
do
echo "Line $count: $line"
count=$[ $count + 1 ]
done
echo "Finished processing the file"