菜鸟学shell编程

来源:互联网 发布:图书管理系统php 编辑:程序博客网 时间:2024/05/21 22:49

本人这段时间这在学习apue,但鉴于使用linux系统,总得学学shell。而且手边就有一个比较小的案例。我的笔记本每次启动ubuntu系统时,都会开启触摸屏。对于我个人而言,这样不太方便。于是,就上网查了一下如何关闭触摸屏。当然有许多方法,比如卸载驱动,修改配置文件等等。在其中选了一个比较简单的方案:启用xinput命令。关于xinput命令,在man手册中是这样描述的:

DESCRIPTION
       xinput  is a utility to list available input devices, query information
       about a device and change input device settings.
其中有enable和disable选项,加上设备名称或号码,那么就大功告成了。

即$xinput disable 15(我的触摸屏设备号为15)。基于此,我就在想,是不是可以用脚本来做这个工作呢。于是就有了我的第一个脚本。


#!/bin/bash

#turn off the TouchPad

xinput disable 15


第一行表示告诉系统,以下内容由此shell(/bin/bash)来解释。注意此行所有字符间不能有空格。第二行为注释。除了第一行,所有以#开头的行都是注释。第三行就是咱们的shell命令。保存为file.sh即可。(这里的.sh后缀不是必须的,之所以如此,个人认为是为了用户看着方便,一眼就可认出哪个是shell脚本文件)在执行前需要加上“执行”权限,网上的通用做法是:$sudo chmod +x file.sh。当然,也可以只加user的权限(u+x)。运行时只需$./file.sh即可


这个脚本是不是有点太简单了?是的。于是就又有了改进版。功能是:测试触摸屏目前的开关状态,并反转。


  1 #!/bin/bash
  2 #switch TouchPad status between disabled and enabled
  3 status=`xinput list-props 15 | grep "Device Enabled" | grep -o [01]$`
  4 if [ $status -eq 1 ] ; then
  5 echo "TouchPad original status is on"
  6 xinput disable 15
  7 echo "TouchPad turned to disabled!"
  8 else
  9 echo "TouchPad original status is off"
 10 xinput enable 15
 11 echo "TouchPad turned to enabled!"
 12 fi
 

通过xinput的list-props命令列出设备的各项参数状态,选取其中的“Device Enabled”项,值为0,代表关闭,值为1,代表打开。具体的语法我参照了网上的帖子,主要就是标量的赋值与引用、if [ test ] ; then结构。网上说的最多的就是其中的“空格”问题,具体见百度。下面我重点说说我在实现的过程中遇到的问题。


问题一:grep。关于grep命令,我想大家都不陌生,但对于一个像我这样的菜鸟来说,还是有挺多地方值得推敲的。在man手册中,他是这样描述的:

DESCRIPTION
       grep  searches the named input FILEs (or standard input if no files are
       named, or if a single hyphen-minus (-) is given as file name) for lines
       containing  a  match to the given PATTERN.  By default, grep prints the
       matching lines.
也就是说,grep在默认情况下,只能得到所匹配内容的所在行,而不是仅仅得到匹配内容。而grep又有一个-o选项
       -o, --only-matching
              Print  only  the  matched  (non-empty) parts of a matching line,
              with each such part on a separate output line.
于是,关于触摸屏状态字符串的截取工作就差不多了,我们就可以得到表示开关状态的那个0或1。


问题二:变量赋值。通常来讲,对于变量赋值,可以直接用var=value的形式(其中,嘴边为变量名,右边为值,可以是数字,字符,字符串,即任意值)。注意在赋值符号的两边,没有空格。但对于此案例,希望把命令运行后的结果赋值给变量。于是就有了我的各种尝试,比如用var=echo {commond},或是用{commond} > var等等。最终在我要疯掉时,看到了一片帖子,上面说“反引号允许你将shell命令的输出赋值给变量。”于是我豁然开朗。


于是也就有了上面的那个脚本。













0 0
原创粉丝点击