博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BashShell脚本的输入
阅读量:6266 次
发布时间:2019-06-22

本文共 4401 字,大约阅读时间需要 14 分钟。

hot3.png

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

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

你可能感兴趣的文章
明小子动力上传拿webshell.zip
查看>>
ES6 Module export与import复合使用
查看>>
第三篇、image 设置圆角的几种方式
查看>>
关于Vs2010 C#使用DirectX的问题
查看>>
EPP(Eclipse PHP)语法高亮仿EditPlus配置
查看>>
OA账号架构权限的问题
查看>>
030——VUE中鼠标语义修饰符
查看>>
python编辑csv
查看>>
sql游标的使用与exec的两种用法
查看>>
数据结构
查看>>
78/90 Subsets --back tracking
查看>>
非托管资源的释放
查看>>
开篇寄语
查看>>
Dijkstra算法的C++实现
查看>>
phpstorm psr2样式.xml
查看>>
js 无限级分类
查看>>
umask值与Linux中文件和目录权限的关系
查看>>
python自动化开发-8
查看>>
bzoj 2127: happiness
查看>>
Python 3.5 之路 day1
查看>>