linux shell在while中用read从键盘输入的实现

系统是ubuntu 14.04 64bit,之前曾想安装Stream来玩dota2,但最终没成功。由于Stream只有32bit,安装Stream时也安装了大量32bit的库。删除Stream后,这些库也一直没管,今天忽然心血来潮,想清理一下系统,把不必要的32bit库都干掉。

dpkg -l | grep "i386"看一下,32bit库太多,一个个敲sudo apt-get purge xxx显然有点累,分析了一下输出,

格式大概如下:

rc libkrb5support0:i386  1.12+dfsg-2ubuntu4  i386 MIT Kerberos runtime libraries - Support library

第2列为包名,第4列是平台,于是决定写一个脚本来删除:

#!/bin/sh

#rc libkrb5support0:i386  1.12+dfsg-2ubuntu4  i386 MIT Kerberos runtime libraries - Support library
#
#
pks=`dpkg -l | grep "i386" | awk '{print $2,$4}'`

tmp="tmp.file"

echo "$pks" > $tmp

while read line
do
  name=`echo $line | awk '{print $1}'`
  platform=`echo $line | awk '{print $2}'`

  # if [ == ] in bash,buf in dash,if [ = ]
  if [ "$platform" = "i386" ];then
    sudo apt-get purge $name
  fi
done < $tmp

rm -rf $tmp

exit 0

这个脚本大体上没有什么错,不过在执行sudo apt-get purge $name这一行时,系统询问是否删除。但是这时却没有机会输入,而是直接中止执行。

xzc@xzc-HP-ProBook-4446s:~$ ./rm_i386_package.sh
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包将被【卸载】:
 libdrm-radeon1:i386*
升级了 0 个软件包,新安装了 0 个软件包,要卸载 1 个软件包,有 306 个软件包未被升级。
解压缩后会消耗掉 0 B 的额外空间。
您希望继续执行吗? [Y/n] 中止执行。

批量删除软件这操作,当然要一个确认,不能加个参数默认执行啊。

查了一下资料,大概是说

while read line
do
# xxx
done < $file

这样会把read指令重定向为文件$file,这时在while中调用read会直接在文件中取一行作为输入。所以在while中要把read重新定向为终端。上面的脚本稍微修改一行:

sudo apt-get purge $name < /dev/tty

这样就OK了。

以上就是小编为大家带来的linux shell在while中用read从键盘输入的实现全部内容了,希望大家多多支持我们~

(0)

相关推荐

  • Linux shell 之 提取文件名和目录名的一些方法总结

    很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等.例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等. 下面介绍两种常用的方法来进行相关的操作. 一.使用${} 1.${var##*/} 该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边

  • Linux shell tr 命令详解

    Linux shell tr 命令详解 1. 用途 tr,translate的简写,主要用于压缩重复字符,删除文件中的控制字符以及进行字符转换操作. 2. 语法 tr [OPTION]... SET1 [SET2] 3. 参数 3.1 -s 压缩重复字符 -s: squeeze-repeats,用SET1指定的字符来替换对应的重复字符 (replace each input sequence of  a  repeated  character  that  is listed in SET1

  • Linux Shell脚本系列教程(六):数组和关联数组

    一.数组和关联数组 数组是Shell脚本非常重要的组成部分,它借助索引将多个独立的独立的数据存储为一个集合.普通数组只能使用整数作为数组索引,关联数组不仅可以使用整数作为索引,也可以使用字符串作为索引.通常情况下,使用字符串做索引更容易被人们理解.Bash从4.0之后开始引入关联数组. 二.定义打印普通数组 数组的方法有如下几种: 复制代码 代码如下: #在一行上列出所有元素 array_var=(1 2 3 4 5 6) #以"索引-值"的形式一一列出 array_var[0]=&q

  • python中执行shell的两种方法总结

    一.使用python内置commands模块执行shell commands对Python的os.popen()进行了封装,使用SHELL命令字符串作为其参数,返回命令的结果数据以及命令执行的状态: 该命令目前已经废弃,被subprocess所替代: # coding=utf-8 ''' Created on 2013年11月22日 @author: crazyant.net ''' import commands import pprint def cmd_exe(cmd_String): p

  • Linux shell常用的73条命令总结

    前言 使用Linux shell是一些程序员每天的基本工作,但我们经常会忘记一些有用的shell命令和技巧.当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务.需要注意一点的是,有些用法需要在你的Linux系统里安装额外的软件.下面话不多说了,来看看详细的内容吧. 检查远程端口是否对bash开放: echo >/dev/tcp/8.8.8.8/53 && echo "open" 让进程转入后台: Ctrl + z 将进程转到前台: fg 产生随机的十六进

  • Shell 数组与关联数组详解及实例代码

    Shell 数组与关联数组 1.数组 1.1. 数组定义 一对圆括号表示数组,数组元素之间用空格符号分割 xiaosi@Qunar:~$ a=(1 2 3) xiaosi@Qunar:~$ echo $a 1 xiaosi@Qunar:~$ a=("yoona" "lucy" "tom") xiaosi@Qunar:~$ echo $a yoona 1.2. 数组长度,元素,赋值与删除 长度:用${#数组名[@或*]} 可以得到数组长度 xiao

  • shell(bash)下“time” 命令的输出详解

    前言 相信大家都知道bash下time是一个很有用的命令,它可以为一段脚本或一个程序的执行计时,这通常在粗略比较程序执行效率的时候很方便.但是你会发现,time命令输出的时间文字不能被简单地重定向,例如重定向至一个文本文件,只能显示在屏幕上,这对于非交互计时很不方便. 例如: $ time find . -name "mysql.sh" >1.txt real 0m0.081s user 0m0.060s sys 0m0.020s $ time find . -name &quo

  • 深入理解Shell输出颜色与控制

    前言 大家都知道使用ls命令列出文件列表时,不同的文件类型会用不同的颜色显示.那么如何实现这样带颜色的文本输出呢?答案并不复杂,不管是用shell还是C语言. 一.shell下的实现方法 先来讲在shell下,如何实现.用echo命令就可以实现,参看以下例子: echo -e "33[32mHello, world!" 当你在终端里敲下这条命令后,是不是发现系统用绿色输出了"Hello,world!",不止如此,连之后的命令提示符都变成了绿色?不要着急,听我继续说.

  • linux shell在while中用read从键盘输入的实现

    系统是ubuntu 14.04 64bit,之前曾想安装Stream来玩dota2,但最终没成功.由于Stream只有32bit,安装Stream时也安装了大量32bit的库.删除Stream后,这些库也一直没管,今天忽然心血来潮,想清理一下系统,把不必要的32bit库都干掉. dpkg -l | grep "i386"看一下,32bit库太多,一个个敲sudo apt-get purge xxx显然有点累,分析了一下输出, 格式大概如下: rc libkrb5support0:i38

  • Linux上使用Python统计每天的键盘输入次数

    Github 项目主页 工具源码 分析结果: total : 15981 1568.0 == Backspace 1103.0 == Tab 1038.0 == Enter 900.0 == Space 765.0 == L_Alt 730.0 == L_Control 700.0 == S 689.0 == L_Shift 544.0 == I 500.0 == A 494.0 == E 410.0 == N 最后的统计结果,: 删除,Enter 空格 使用最多 Web Redis此项目将re

  • 开发者常用及实用Linux Shell命令备忘录(小结)

    最近都需要在 Linux 系统下开发,所以经常需要在终端中进行操作.Linux 有很多 shell 命令可以帮助我们完成任务,但不常使用的话就会忘记掉. 本篇作为命令备忘录,我会将实际工作当中用到的命令记录下来,并长期保持更新. 1.which which 用于查找一个文件,并返回绝对路径,查找的目录范围由系统的 PATH 指定. 由于 Linux 中一切皆文件,所以 which 指定更多的是查找系统中有没有这个命令. 比如,查找 ls 命令,我们可知它的可执行文件的位置 which ls /b

  • linux shell数据重定向(输入重定向与输出重定向)详细分析

    在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作. 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值. linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error outp

  • Linux Shell脚本面试25问集合

    Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell脚本)来完成这些日常工作任务. Q:2 什么是默认登录shell,如何改变指定用户的登录shell 答:在Linux操作系统,"/bin/bash"是默认登录shell,是在创建用户时分配的.使用chsh命令可以改变默认的shell.示例如下所示: # chsh <user

  • linux shell 中 2>&1的含义

    linux shell 中"2>&1"的含义 脚本: nohup /mnt/Nand3/H2000G  >/dev/null  2>&1  & 对于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result ,然后复制标准输出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一个文件表项,也可以说错误的输出

  • Linux shell脚本的建立与执行

    在进行linux测试时编写脚本是必不可少的.最近经常使用Linux,感觉太频繁地敲击键盘有些累了,于是想到了Shell脚本.可以把太多的命令写成一个脚本,这样每次执行一遍  shell文件,就可以省去了敲击键盘的时间.于是在网上搜了一些有关Linux下脚本编程的内容. Shell不仅仅是命令的收集,而且是一门非常棒的编程语言.您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性.可维护性和便携性比效率更重要的任务. 用户可以使用任何文本编辑器编辑shel

  • Linux shell 提取文件名和目录名的方法

    ${} [root@node01 ~]# file=/dir1/dir2/dir3/my.file.txt [root@node01 ~]# echo ${file#*/} dir1/dir2/dir3/my.file.txt 删掉第一个 / 及其左边的字符串 [root@node01 ~]# echo ${file##*/} my.file.txt 删掉最后一个 /  及其左边的字符串 [root@node01 ~]# echo ${file#*.} file.txt 删掉第一个 .  及其左

  • linux shell字符串截取的详细总结(实用!)

    目录 一.字符串变量的截取操作 1.从指定位置(index)截取固定长度 2.截取指定字符串(子字符串)左边的字符 3.截取指定字符串(子字符串)右边的字符 二.用cut命令截取(适合处理管道流或行文本字符) 补充:使用%和%%:截取的是指定字符前边内容 总结 一.字符串变量的截取操作 对字符串变量的截取操作一般都是通过${操作符}的方式进行,如下: 1.从指定位置(index)截取固定长度 格式:${string:start:length} 其中,string 是要截取的字符串,start 是

  • Linux Shell脚本的编程之正则表达式

    一 正则表达式与通配符 1 正则表达式是用在文件中匹配符合条件的字符串,正则是包含匹配,grep,awk,sed等命令可以支持正则表达式 2 通配符是用来匹配符合条件的文件名,通配符是完全匹配,ls,find,cp这些命令不支持正则表达式,所以只能用Shell自己的通配符来进行匹配了. 二 基础正则表达式 这里引用兄弟连的测试文本 1 * 前一个字符匹配0次或任意多次 grep "a*" test_rule.txt 匹配所有内容,包括空白行(由于*可以匹配0次) grep "

随机推荐