BashShell脚本的输入

##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"

转载于:https://my.oschina.net/u/3304023/blog/1457117

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值