Ctrl + Alt + T 打开终端, $代表普通用户,#代表超级用户(root user)
如:    xiangqi@xiangqi ~$
           root@xiangqi ~#

echo打印,后可接无引号、单引号、爽引号,方法基本类似,特殊的地方在于:
(1)希望打印!时,双引号中需要加转义字符 \ ,如 echo " Hello \!" (在shell中貌似不存在这个问题)
(2)用单引号时,比如echo '$var',这时没法对单引号中的变量求值,仅仅打印$var
另一种打印方法是printf,用法与C相同
printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 1 James 82.3432
printf "%-5s %-10s %-4.2f\n" 2 Lucy 77.986
代表左对齐5个宽度字符串、左对齐10个宽度字符串、左对齐4个宽度2位小数浮点数

环境变量:
环境变量是未在当前进程中定义,而从父进程中继承而来的变量。
(1)通过env查看环境变量
(2)如果要查一个进程的环境变量,则pgrep查询该进程的PID,再调用cat /proc/$PID/environ
        例如有一个gedit的应用程序正在运行:
        $ pgrep gedit
        12501
        $ cat /proc/12501/environ
        更清晰地显示,则输入命令:
        $ cat /proc/12501/environ  | tr '\0' '\n'
(3)export命令用来设置环境变量。

赋值及运算:
var=value 赋值操作
var = value 相等操作
可以利用let和[]进行基本运算,高级运算常用expr和bc
示例:
#! /bin/bash
# test
no1=3
no2=4
echo reslut1=$[ no1 + no2 ]
echo reslut2=$[ $no1 + no2 ]
echo reslut3=$[ $no1 + $no2 ]
let no1++
let no2--
echo reslut4=$no1
echo result5=$no2
结果分别是
reslut1=7
reslut2=7
reslut3=7
reslut4=4
result5=3

数组和关联数组
示例:
#! /bin/bash
# test
array_value_1=(1 2 3 4 5 6) #赋值定义一个数组
array_value_2[0]="test1" #赋值分别定义一个数组的元素
array_value_2[1]="test2"
array_value_2[2]="test3"
array_value_2[3]="test4"
echo ${array_value_1[2]}  #打印结果3
echo ${array_value_2[3]}  #打印结果test4
echo ${array_value_1[@]}  #以清单形式打印所有的值1 2 3 4 5 6
echo ${#array_value_2[@]} #打印数组长度4

关联数组定义时需要首先通过declare声明语句
示例:
#! /bin/bash
# test
declare -a array #-a代表定义数组,类似的还有-f定义函数,-i定义整型
array=([apple]="100 dollars" [orange]="80 dollars" [lemon]="50 dollars")
echo "Orange costs ${array[orange]}"

函数:
(1)函数的定义:
functionname()
{
statements;
}
(2)函数的调用
functionname或者functionname arg1 arg2
(3)函数支持递归,最典型的例子:fork炸弹 :(){:|:&};:
具体为:
:()        #说明下面要定义一个函数,函数名为小数点,没有可选参数。
{        #表示函数体开始
:|: &    #用递归方式调用":"函数本身,并用管道(pipe)将其输出引至另一次递归调用的":"函数,即":|:"表示的是每次调用函数":"的时候就会生成两份拷贝
        #最后的 & 代表调用间脱钩,以使最初的":"函数被杀死后为其所调用的两个":"函数还能继续执行
}        #函数结束标识
;        #函数定义结束后将要进行的操作
:        #调用":"函数,"引爆"fork炸弹

管道:
$ cmd1 | cmd2 | cmd3
代表的是cmd1的输出传递给cmd2,cmd2的输出传递给cmd3,cmd3的输出将会被打印或导入其他文件
例如:
$ ls | cat -n > out.txt        #ls的输出传给cat -n,cat -n加上行号,重定向到out.txt文件
$ cmd_output=$(ls | cat -n)    #cmd_ouput命令可以读取输出
$ echo cmd_output

比较:
[ condition ] && action    #如果condition为真,则执行action
[ condition ] || action    #如果condition为假,则执行action

内部字段分割符IFS:
(1)示例:
#! /bin/bash
# test
data="name,sex,year,location"
oldIFS=$IFS            #IFS默认值是空白字符
IFS=","                #将IFS设置成逗号
for item in $data
do
echo Item: $item
done
IFS=$oldIFS
结果打印出来即:
Item: name
Item: sex
Item: year
Item: location
(2)示例:
#! /bin/bash
# test
data="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS
IFS=":"
count=0
for item in $data
do
[ $count -eq 0 ] && user=$item        #count=0时,把此时的item赋值给user
[ $count -eq 6 ] && shell=$item        #count=6时,把此时的item赋值给shell
let count++
done
IFS=$oldIFS
echo $user\'s shell is $shell
结果打印出来即:
root's shell is /bin/bash

find命令:
$find . -print        #打印当前目录的文件和目录列表
$find .. -print        #打印父目录的文件和目录列表
$find /home -print    #打印/home目录的文件和目录列表
$find /home -name "*.txt" -print    #打印/home目录名字中含有.txt的文件列表
$find /home \( -name "*.txt" -o -name "*.pdf" \) -print        #打印/home目录名字中含有.txt或.pdf的文件列表
$find /home -iname "*.txt" -print    #打印/home目录名字中含有.txt(忽略大小写)的文件列表
$find /home -path "*slynux*" -print    #打印/home目录文件路径中含有slynux的文件路径或文件列表
$find /home -regex ".*\(\.py\|\.sh)$"    #打印/home目录中含有.py或.sh的文件列表
$find /home -iregex ".*\(\.py\|\.sh)$"    #打印/home目录中含有.py或.sh(忽略大小写)的文件列表
$find /home ! -name "*.txt" -print        #打印/home目录名字中不含有.txt的文件列表c8c4e6999b8-
$find . -maxdepth 1 -print    #打印最大搜索深度为1的文件和目录列表
$find . -mindepth 2 -print    #打印最小搜索深度为2的文件和目录列表
$find . -maxdepth 1  -type f -print        #打印最大搜索深度为1的文件
$find . -maxdepth 1  -type d -print        #打印最大搜索深度为1的目录列表
$find . -type f -atime -7 -print    #打印当前目录最近7天内被访问的所有文件
$find . -type f -mtime 7 -print        #打印当前目录恰好7天前被修改过的所有文件
$find . -type f -ctime +7 -print    #打印当前目录元数据(例如权限等)最后一次变化时间超过7天的所有文件
$find . -type f -amin +7 -print        #打印当前目录访问时间超过7分钟的所有文件
$find . -type f -size +2k    #打印当前目录文件大小大于2k的所有文件
$find . -type f -perm 644 -print    #打印当前目录访问权限为644的所有文件
$find /home -name "*.txt" -delete    #删除/home目录名字中含有.txt的文件列表

find与exec合用:
-exec: 对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格,同时两个{}之间没有空格
$find . -type f -name "*.c" -exec cat {} \;> all_c_files.txt
将当前目录中所有c文件都找出来,通过cat拼接成1个大的all_c_files.txt文件
其中{}是1个特殊的字符串,代表匹配,对于每一个匹配的文件,{}会被替换成相应的文件名。
$find . -type f -name "*.txt" -exec printf "Text file: %s\n" {} \;
找到文件并打印
补充说明:{}后边一定要加分号

find与xargs合用:
xargs:主要功能是从输入中构建和执行shell命令。       
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。  
例1:删除path下的文件
rm `find /path -type f`
如果path下的文件过多,会因为参数列表过长而报错,改用xargs,问题可以解决:
$find /path -type f -print0|xargs -0 rm
这里,-print0表示输出以null分隔(-print使用换行);-0表示输入以null分隔
例2:统计所有c程序的行数
$find /path -type f -name "*.c" -print0|xargs -0 wc -l

tr转换:
tr set1 set2
将set1映射到set2,如果set1更长,则set2会不断重复最后一个字符,直到长度和set1相等,如果set2长,那么超出部分会自动被舍弃。
如:
$ echo "ABCDEFGHIJKLMN"|tr 'A-Z' 'a-z'
abcdefghijklmn
$ echo "ABCDEFGHIJKLMN"|tr 'A-G' 'a-g'
abcdefgHIJKLMN
$ echo "ABCDEFGHIJKLMN"|tr 'A-Z' 'a-d'
abcddddddddddd
由此可以看出,tr可以用于加密解密
此外,tr还有删除功能,具体为:
$cat filename | tr -d '[set]'        #删除set中字符
$cat filename | tr -d -c '[set]'    #删除set以外字符
如:
$ echo "ABCDEFG" | tr -d 'ABCD'
EFG
$ echo "ABCDEFG" | tr -d -c 'ABCD\n'
ABCD

切分文件名:
(1)${VAR%.*}    删除VAR中位于%右侧的通配符(即.*)所匹配的字符串,从右到左找出最短结果
(2)${VAR#*.}    删除VAR中位于#右侧的通配符(即*.)所匹配的字符串,从左到右找出最短结果
(3)${VAR%%.*}    删除VAR中位于%右侧的通配符(即.*)所匹配的字符串,从右到左找出最长结果
(2)${VAR##*.}    删除VAR中位于#右侧的通配符(即*.)所匹配的字符串,从左到右找出最长结果
示例:假定URL="www.google.com"
$ echo ${URL%.*}    得到 www.google
$ echo ${URL%%.*}    得到    www
$ echo ${URL#*.}    得到 google.com
$ echo ${URL##*.}    得到    com

统计文件:
(1)统计行数         $wc -l filename    或者    $cat filename | wc -l
(2)统计单词数     $wc -w filename    或者    $cat filename | wc -w
(1)统计字符数     $wc -c filename    或者    $cat filename | wc -c

例题:输入dkdkkiaoiqqiwideiujdiwd,统计每个字母出现字数并按字母表排序
INPUT="dkdkkiaoiqqiwideiujdiwd"
OUTPUT=`echo $INPUT | sed 's/[^n]/&\n/g' | sed '/^$/d' | sort | uniq -c | tr -d ' \n' `
echo $OUTPUT
结果为:1a5d1e6i1j3k1o2q1u2w
其中:
sed 's/[^n]/&\n/g'     #在每个字符后追加1个换行符,使得每行只出现一个字符
sed '/^$/d'         #最后1个字符会被sed替换成“字符+\n”,所以多出1个换行符并在最后形成1个空行,这个命令删除最后的空行
sort                #排序
uniq -c                #打印出每行各重复了多少次
tr -d ' \n'            #删除空格和换行符,形成最终结果

Linux下的shell编程(二)BY 四喜三顺的更多相关文章

  1. Linux下的Shell编程

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  2. Linux下的shell编程入门

    通常情况下,我们从命令行输入命令每输入一次就能够得到系统的一次响应.一旦需要我们一个接着一个的输入命令而最后才得到结果的时候,这样的做法显然就没有效率.要达到这样的目的,通常我们利用shell程序或者 ...

  3. linux下的Shell编程(3)shell里的流程控制

    if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...

  4. Linux下的Shell编程(1)最简单的例子

    深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. 从第一行开始 我们可以使用任意一种文字编辑器编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #!/bi ...

  5. linux下的Shell编程(7)使用-x和-n调试shell程序

    我们也可以在Shell下调试Shell Script脚本,当然最简单的方法就是用echo输出查看变量取值了.Bash也提供了真正的调试方法,就是执行脚本的时候用-x参数. sh -x filename ...

  6. Linux下的shell编程(一)BY 四喜三顺

    Ctrl + Alt + Tvim文本编辑器:i(插入模式),v(可视模式),Esc(普通模式),:w(保存),:r(打开),:q(退出)gvim 文本编辑器vim的升级版gedit 更常用的文本编辑 ...

  7. Linux下的shell编程(三)BY 四喜三顺

    正则表达式:-------------------------------------------------------------------------------------------^   ...

  8. Linux下的Shell编程(2)环境变量和局部变量

    Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型. 局部变量在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量.这些变量与环境变量不 ...

  9. linux下的Shell编程(8)自定义函数

    Shell Script中也可以使用自定义的函数,其语法形式如下: functionname() { - }

随机推荐

  1. Arduino101/Genuino101的安装入门

    1.首先下载Arduino IDE                      下载地址:http://pan.baidu.com/s/1gewqV2j 选择arduino-1.6.8-windows. ...

  2. Python实例1

    1.有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 错解: 正解: 源码: #!/usr/bin/python for i in range(1,5): for j in ...

  3. Android手机录制视频 实时传输(转载)

    最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...

  4. xloader

    [1],先看一下整个系统的结构(软件是灵魂,硬件是驱体,再强大的灵魂力若没有躯体终将是游魂野鬼,再强壮的驱体若没有灵魂终将是植物人) 结构 作用 备注 硬件 一切软件的载体   xloader 引导u ...

  5. Linear Algebra lecture4 note

    Inverse of AB,A^(A的转置) Product of elimination matrices  A=LU (no row exchanges)   Inverse of AB,A^(A ...

  6. hdu 1010 深搜+剪枝

    深度搜索 剪枝 还不是很理解 贴上众神代码 //http://blog.csdn.net/vsooda/article/details/7884772#include<iostream> ...

  7. Linux中MySQL的基本操作

    1. 用root用户登录mysql mysql -u root -p 2. 查看database show databases; 3. 查看table use database名 show table ...

  8. Ubuntu14.04用apt在线/离线安装CDH5.1.2[Apache Hadoop 2.3.0]

    目录 [TOC] 1.CDH介绍 1.1.什么是CDH和CM? CDH一个对Apache Hadoop的集成环境的封装,可以使用Cloudera Manager进行自动化安装. Cloudera-Ma ...

  9. Assembler : The Basics In Reversing

    Assembler : The Basics In Reversing Indeed: the basics!! This is all far from complete but covers ab ...

  10. 介绍四款windows下的神器

    四款神器:Q-dir, Cmder, Everything, launchy Q-dir Q-dir: windows自带资源管理器explorer的加强版.(windows自带的资料管理器explo ...