shell Script学习笔记

《鸟哥的Linux私房菜 3rd Edition》:

@1:若变量内容中包含空格字符,则可使用双引号"或单引号'将变量内容结合起来,但不同的是:

  #1:双引号内的特殊字符(如 $ 等),会保有原本的特性:

  var="lang is $LANG"

  echo $var

  可得lang is en_US

  #2:单引号内的特殊字符则仅为一般字符 (纯文本):

  var='lang is $LANG'

  echo $var

  可得lang is $LANG

  【说明】:

  单引号与双引号必须要成对:

  name="VBird's name"  #OK

  命令是由左边向右找,先遇到的引号先有用,因此如上所示,单引号会失效!

  name=VBird\'s\ name  #OK

  单引号 和 空格 都需要进行转义

@2:在一串命令中,可能会需要藉由其他的命令提供的信息,此时就可以使用 反单引号 `  如: `命令`  或  $(命令)

  ls $(pwd)     #或ls `pwd`

  说明: 在一串命令中,在单引号和括号之内的命令将会被先运行

  使用$运算符的结构比较特殊,因为圆括号内的命令将在一个子shell中执行,执行完后关闭子shell并将结果返回给最初的shell中。此时就需要注意,如果设置了当前shell的某些特殊的环境条件,则这些条件可能不会转移到子shell中(例如手动设置的PATH值),那么子shell可能不会继承这些条件,这时,这些命令将失效。

  其实还可以使用花括号实现同样的功能:  ls ${pwd}

  与圆括号的区别是,如果使用花括号,则花括号中的命令是在当前的shell中执行的,并不需要产生子shell。花括号并不是在所有的UNIX版本中都有效。

@3:若要扩增某一变量的内容,则可使用下面的形式:

  "$变量名称"或${变量}   累加内容      #【双引号要写】

  例:PATH="$PATH":/home/bin

  【注意】:

  范例1:我要在 PATH 这个变量当中累加/home/dmtsai/bin 这个目录  

[root@www ~]# PATH=$PATH:/home/dmtsai/bin
[root@www ~]# PATH="$PATH":/home/dmtsai/bin
[root@www ~]# PATH=${PATH}:/home/dmtsai/bin

  上面这三种格式在 PATH 里头的配置都是 OK 的!但是底下的例子就不见得了!

  范例2:承范例1,我要将 name 的内容多出 "yes" 呢?  

[root@www ~]# name=$nameyes
如果没有双引号,那么变量成了啥?name 的内容是 $nameyes 这个变量!
[root@www ~]# name="$name"yes
[root@www ~]# name=${name}yes     #推荐这种方式

@4:取消变量的方法为使用unset:

  unset 变量名称

  例如取消 myname 的配置:

  unset myname

@5:数组定义:

lxw@lxw-Aspire-4736Z:~$ declare -a array
lxw@lxw-Aspire-4736Z:~$ array[]="sm"
lxw@lxw-Aspire-4736Z:~$ array[]="bm"
lxw@lxw-Aspire-4736Z:~$ array[]="nm"
lxw@lxw-Aspire-4736Z:~$ echo $array[]     #【NOTE】
[]
lxw@lxw-Aspire-4736Z:~$ echo ${array[]}
sm
lxw@lxw-Aspire-4736Z:~$ echo ${array[]}
bm
lxw@lxw-Aspire-4736Z:~$ echo ${array[]}    #【NOTE】 lxw@lxw-Aspire-4736Z:~$ echo ${array[]}
nm
lxw@lxw-Aspire-4736Z:~$ echo "${array[1]},${array[2]},${array[3]}"
sm,bm,nm
lxw@lxw-Aspire-4736Z:~$ echo ${array} lxw@lxw-Aspire-4736Z:~$

  更多关于数组的用法可以到文章末尾提到的shell文件中查看。

@6:[root@www ~]# work="/cluster/server/work/taiwan_2005/003/"

    [root@www ~]# cd $work

@7:touchDateFile.sh 中 为file1, file2, file3变量赋值的这种方法

touchDateFile.sh:

#!/bin/bash
first="log"
#second=$(date)
last=".txt"
second=""
file1="$first$second$last"
second=""
file2="$first$second$last"
second=""
file3="$first$second$last"
touch $file1 $file2 $file3

执行脚本查看运行结果:

[liu@localhost scripts_centos]$ bash touchDateFile.sh
[liu@localhost scripts_centos]$ ls
log11.txt log22.txt log33.txt touchDateFile.sh
[liu@localhost scripts_centos]$ echo $file2    #什么也打印不出来 [liu@localhost scripts_centos]$ source touchDateFile.sh
[liu@localhost scripts_centos]$ ls
log11.txt log22.txt log33.txt touchDateFile.sh
[liu@localhost scripts_centos]$ echo
$file2
log22.txt
[liu@localhost scripts_centos]$

利用source命令运行脚本,则脚本在当前shell中运行; 用bash命令运行脚本,则会创建一个新的shell运行。

使用bash运行shell脚本程序时,系统将创建一个子shell,当该脚本程序运行完毕时,它的脚本shell将终止,并返回到执行该脚本之前的shell。

source在当前bash环境下执行命令,而bash是启动一个子shell来执行命令。

source命令通常用命令“.”来替代。如:source .bash_rc 与 . .bash_rc 是等效的。

【注意】当把设置环境变量(或alias等)的命令写进shell脚本中时,如果用bash命令运行脚本文件,则只会影响子shell,无法改变当前的shell,所以通过shell脚本设置环境变量时,要用source命令。

@8:

cmd1 && cmd2  1. 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2。
          2. 若 cmd1 运行完毕且为错误 ($?≠0),则 cmd2 不运行。

cmd1 || cmd2    1. 若 cmd1 运行完毕且正确运行($?=0),则 cmd2 不运行。
          2. 若 cmd1 运行完毕且为错误 ($?≠0),则开始运行 cmd2。

Linux 底下的命令都是由左往右运行的,如:

ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe   #从左往右运行

@9:“test” 和 “[ ]” 的用法

#1: 使用[ ]的三条原则

在中括号 [ ] 内的每个组件都需要有空白键来分隔;

在中括号内的变量,最好都以双引号括号起来;

在中括号内的常数,最好都以单或双引号括号起来。

#2: 除了将多个条件写入一个中括号"[ ]"内的情况之外, 还可以用多个中括号来隔开,括号与括号之间以 && 或 || 来隔开,他们的意义是:

&& 代表 and    || 代表 or

所以,在使用中括号的判断式中, && 及 || 就与 命令下达(前面的@8 )的状态不同了。

例如:
[ "$yn" == "Y" -o "$yn" == "y" ]

上式可替换为

[ "$yn" == "Y" ] || [ "$yn" == "y" ]

之所以这样改,很多人是习惯问题,很多人喜欢一个中括号仅有一个判别式。

@10:

[liu@localhost OpenSource]$ echo "abcde" | tr "a-z" "a-c"
abccc
[liu@localhost OpenSource]$ echo "abcde" | tr "a-z" "A-Z"

ABCDE
[liu@localhost OpenSource]$

tr converts the character in the first string to those in the second string.

@11:指令搜寻的顺序:

  1. 以相对/绝对路径执行指令,例如 /bin/ls 或 ./ls ;

  2. 由 alias 找到该指令来执行;

  3. 由 bash 内建的 (builtin)指令来执行;

  4. 透过 $PATH 这个变量的顺序搜寻到的第一个指令;

@12:用 echo 命令可以“输出”一些特殊的字符(如\a,发出咚的一声),但必须要加上 -e 的选项才行!

如:echo -e "Hello World!\a\n"

@13:shell script 的追踪与 debug

$ sh [-nvx] scripts.sh

选项与参数:

-n :不运行 script,仅查询语法的问题;

-v :再运行 sccript 前,先将 scripts 的内容输出到萤幕上;

-x :很有用的参数【把计算的过程输出出来,如:每次循环的计算过程】

@14:检测用户是否输入信息(而不是直接按回车)

read -p "Input : " input
var=${input:-"Default Value"} # If input got the value, then $var==$input; else {$var=="Default Value"; $input==""} echo "\$input is \"$input\""
echo "\$var is \"$var\""

运行程序查看结果(第一次bash try.sh执行程序时,对于Input提示直接按回车;第二次执行程序时,对于Input提示输入“lxw”):

lxw :::~/github/if_case_while_awk$ bash try.sh
Input :
$input is ""
$var is "Default Value"
lxw :::~/github/if_case_while_awk$ bash try.sh
Input : lxw
$input is "lxw"
$var is "lxw"
lxw :::~/github/if_case_while_awk$

《 Unix入门经典》:

@1:Unix变量通常使用大写字母表示。

@2:比较运算符:

字符串比较: =. !=, >, <

整数比较:-ge, -gt, -le, -lt, -ne, -eq

@3:13章 14章

  我将学习到的大多数语句都整理了出来,放在了Github上,如果你想得到这个脚本文件basicShellScripts.sh,可以到这里下载。

Shell Script Notes的更多相关文章

  1. shell及脚本4——shell script

    一.格式 1.1 开头 必须以 "# !/bin/bash"  开头,告诉系统这是一个bash shell脚本.注意#与!中间有空格. 二.语法 2.1 数值运算 可以用decla ...

  2. shell script

    一.shell script的编写与执行 1.shell script 的编写中还需要用到下面的注意事项: a.命令的执行是从上到下,从左到右地分析与执行 b.命令.参数间的多个空白都会被忽略掉 c. ...

  3. (copy) Shell Script to Check Linux System Health

    source: http://linoxide.com/linux-shell-script/shell-script-check-linux-system-health/ This article ...

  4. shell script练习

    执行脚本的几种方式: 1. sh a.sh 或者  bash a.sh  调用的是 /bin/bash 进程执行的,所以脚本不需要执行权限. 2. 直接使用绝对路径执行, /home/script/a ...

  5. 这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script

    这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script ##转载注明出处:http://www.cnblogs.com/wade-xu/p/4378224.html ...

  6. CentOS Linux下一个tomcat起停,查看日志的shell script

    CentOS 的tomcat安装目录:/usr/local/tomcat vi MyTomcatUitl.sh          创建文件chmod u+x MyTomcatUtil.sh   赋执行 ...

  7. Shell script for logging cpu and memory usage of a Linux process

    Shell script for logging cpu and memory usage of a Linux process http://www.unix.com/shell-programmi ...

  8. shell script入门

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

  9. shell script 的追踪与 debug

    shell script 的追踪与 debug scripts 在运行之前,最怕的就是出现语法错误的问题了!那么我们如何 debug 呢?有没有办法不需要透过直接运行该 scripts 就可以来判断是 ...

随机推荐

  1. Verilog HDL test bench 문법에 관한

    16bit ripple carry adder test bench `timescale 1ns/1ns module testbench2; reg [15:0] a, [15:0] b, c_ ...

  2. JQuery常用操作实现方式

    http://www.cnblogs.com/guomingfeng/articles/2038707.html 一个优秀的 JavaScript 框架,一篇 jQuery 常用方法及函数的文章留存备 ...

  3. 关于angularjs在IE里的坑——F12工具打开,功能正常,关闭之后,angularjs not working

    前端时间在做项目的时候,用到了angularjs,期间,发现了一个奇葩的问题,就是在IE11浏览器下,点击下方图1上箭头所示的位置,将此处的开关变为图2中箭头所示的样子,但是发觉没有反应,开关还是灰色 ...

  4. 小程序图表功能wxchart实现

    在开发小程序过程中,有项目用到图表功能, 其实Echart.js有小程序的库,我们要吧引入进来,然后配置初始化一下,就可以达到目的了.接下来就开始步骤吧 首先下载JS库:http://download ...

  5. NPOI读取操作excel

    .读取using (FileStream stream = new FileStream(@"c:\客户资料.xls", FileMode.Open, FileAccess.Rea ...

  6. 最新 AFNetworking 3.0 简单实用封装

    AFNetworking 3.0 的到来使我们开发者又方便了许多,话不多说,直接上代码. 1.首先 引入框架AFNetworking框架 GitHub下载地址:https://github.com/A ...

  7. Perl/C#连接Oracle/SQL Server和简单操作

    连接数据库是一个很常见也很必须的操作.先将我用到的总结一下. 1. Perl 连接数据库 Perl 连接数据库的思路都是: 1)使用DBI模块: 2)创建数据库连接句柄dbh: 3)利用dbh创建语句 ...

  8. linux fedora 14(内核2.6.35.6) PF_RING+libpcap 极速捕获千兆网数据包,不丢包

    前面讲到了libpcap 捕获数据包,尤其在千兆网的条件下,大量的丢包,网上搜索好久,大概都是PF_PACKET +MMAP,NAPI,PF_RING之类的方法,我对PF_RING+libpcap进行 ...

  9. ubuntu下软件安装

    1. 软件源:ubuntu.cn99.com/ubuntu2. 安装vncviewer    sudo apt-get install vncviewer3. aptitude     sudo ap ...

  10. libsvm easy.py ValueError: need more than 0 values to unpack windows下终极解决

    现象是: python easy.py train test 输出: Scaling training data...WARNING: original #nonzeros 100389 new #n ...