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. PL_SQL导入数据库数据

    首先用pl/sql将数据批量导出或者全部导出具体操作如下 点击工具 ----->导出数据---->SQL插入 导出的数据格式如下:   prompt PL/SQL Developer im ...

  2. java中常见的几种Runtimeexception

    转自http://blog.csdn.net/qq635785620/article/details/7781026 一般面试中java Exception(runtimeException )是必会 ...

  3. 关于Java的基本类型

    Java的基本类型分为整数型,浮点型,字符型,布尔型.顾名思义整数型用来表示整数,浮点型用来表示带小数的数,字符型用来表示字符.特殊的是布尔型用来表示逻辑上的true(真)和false(假),一般与分 ...

  4. 【转载】ANSYS完全法与模态叠加法瞬态分析实例

    原文地址:http://www.caetecc.com/thread-2172-1-1.html ! 半脉冲载荷 --- 模态叠加法fini/clear,nostart/PREP7ET,1,BEAM4 ...

  5. Get Jenkins job build queue length

    Jenkins API doesn’t provide the job build queue length. Hence, it seems we have to parse the html to ...

  6. Android延时执行调用的几种方法

    一.开启新线程 new Thread(new Runnable(){        public void run(){            Thread.sleep(XXXX);          ...

  7. 采用sqlserver的缺省配置,在生产环境经常碰到系统响应慢(甚至hung的情况)

    请重视并正确配置sqlserver实例及数据库的参数,一般化的配置推荐如下: 1.数据和日志文件的初始大小分别设置为10G和2G,均设置为按照固定200M大小增长,不限制最大值: 2.sever实例设 ...

  8. AutoVue打开ProE工程图中文乱码

    解决办法: 在AutoVue安装目录/Bin/allusers.ini中增加 [Options]ProELang=Chinese_cn

  9. [wxWidgets] 2. 重访“Hello World” 程序

    这是四年多来在博客园的第二篇博客.有了上一次的排版使用经验,这一篇文章应该有些进步(^_^). 闲话按下不表,言归正传.在编译.成功运行了上一个helloWorld.cpp(后文中'hw'简称hell ...

  10. 使用Navicat连接数据库,不能创建外键

    最近在学习python中遇到这样的情况,使用Navicat连接MySQL,为表结构创建外键时,出现了创建外键就消失,而且外键也没有创建成功的情况. 在网上找了些资料,最后发现是MySQL引擎的问题.由 ...