linux shell script脚本

这里有个30分钟上手的文档,写得很极简:https://github.com/qinjx/30min_guides/blob/master/shell.md

有关bash的操作
1.一个bash就是一个独立的程序,有自己的PID,如果运行该脚本,它底下的任何命令都是这个bash衍生出来的子程序。若要回到原本的bash去,只有将第二个bash结束(下达exit或者logout)
shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了,因为 Shell scripts 的速度较慢,且使用的 CPU 资源较多,造成主机资源的分配不良
shell script 其实就是纯文字档,我们可以编辑这个文件,然后让这个文件来帮我们一次运行多个命令, 或者是利用一些运算与逻辑判断来帮我们达成某些功能。
在shell环境中,可以通过env查看环境变量
set包含环境变量和自定义变量
env和set的差距就在于该变量是否会被子程序继续使用
export命令:就是将自定义变量转成环境变量

几个很有用的命令

1.read的命令很有用,能和使用者交互
-p:后接提示字符
-t: 等待使用者反映的时间,超时直接跳过

2.declare [+/-][rxi][变量名称=设置值] 或 declare -f
参数说明:

+/-  "-“可用来指定变量的属性,”+"则是取消变量所设的属性。
-f  仅显示函数。
r  将变量设置为只读。
x  指定的变量会成为环境变量,可供shell以外的程序来使用。
i  [设置值]可以是数值,字符串或运算式。
声明数组变量

 declare -a cd='([0]="a" [1]="b" [2]="c")' //声明数组变量
echo ${cd[1]}
b //显示变量内容

echo ${cd[@]} //显示整个数组变量内容
a b c

显示函数
declare -f

command_not_found_handle () 
{ 
  if [ -x /usr/lib/command-not-found ]; then
    /usr/bin/python /usr/lib/command-not-found -- $1;
    return $?;
  else
    if [ -x /usr/share/command-not-found ]; then
      /usr/bin/python /usr/share/command-not-found -- $1;
      return $?;
    else
      return 127;
    fi;
  fi
}

变量的配置守则

1 变量与变量内容以一个等号『=』来连结,如下所示: 
『myname=VBird』

2 等号两边不能直接接空格符,如下所示为错误: 
『myname = VBird』或『myname=VBird Tsai』

3 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误: 
『2myname=VBird』

4 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』

5 可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;

6 在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,
那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』

7 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
『PATH="$PATH":/home/bin』

8 若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:
『export PATH』

9 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;

10 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
『unset myname』

例题:
在变量的配置当中,单引号与双引号的用途有何不同?
答:
单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符 ,而不会有特殊符号。
我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个变量
的内容定义出 myname 显示 VBird its me 这个内容,要如何订定呢?
[root@www ~]# name=VBird
[root@www ~]# echo $name
VBird
[root@www ~]# myname="$name its me"
[root@www ~]# echo $myname
VBird its me
[root@www ~]# myname='$name its me'
[root@www ~]# echo $myname
$name its me
发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的变量内容,仅为一般字符的显示型态而已!
这里必需要特别小心在意!
read -p "请输入姓名:" -t 30 named
(表示等待30s等使用者输入姓名)
echo $named (显示刚在shell里输入的变量named的内容)
1.命令的运行是从上而下、从左而右的分析与运行;
2.命令的下达就如同第五章内提到的: 命令、选项与参数间的多个空白都会被忽略掉;
3.空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空白键;
4.如果读取到一个 Enter 符号 (CR) ,就尝试开始运行该行 (或该串) 命令;
5.至於如果一行的内容太多,则可以使用『 \[Enter] 』来延伸至下一行;
6.『 # 』可做为注解!任何加在 # 后面的数据将全部被视为注解文字而被忽略!

一定要养成良好的 script 撰写习惯,在每个 script 的档头处记录好:

script 的功能;
script 的版本资讯;
script 的作者与联络方式;
script 的版权宣告方式;
script 的 History (历史纪录);
script 内较特殊的命令,使用『绝对路径』的方式来下达;
script 运行时需要的环境变量预先宣告与配置。

程序码的撰写最好使用巢状方式,在包覆的内部程序码最好能以 [tab] 按键的空格向后推, 这样你的程序码会显的非常的漂亮与有条理!在查阅与 debug 上较为轻松愉快喔! 另外,使用撰写 script 的工具最好使用 vim 而不是 vi ,因为 vim 会有额外的语法检验机制,能够在第一阶段撰写时就发现语法方面的问题喔!

shell只定义了一个非常简单的编程语言,所以,如果你的脚本程序复杂度较高,或者要操作的数据结构比较复杂,那么还是应该使用Python、Perl这样的脚本语言,或者是你本来就已经很擅长的高级语言。因为sh和bash在这方面很弱,比如说:

它的函数只能返回字串,无法返回数组
它不支持面向对象,你无法实现一些优雅的设计模式
它是解释型的,一边解释一边执行,连PHP那种预编译都不是,如果你的脚本包含错误(例如调用了不存在的函数),只要没执行到这一行,就不会报错

如果你的脚本是提供给别的用户使用,使用sh或者bash,你的脚本将具有最好的环境兼容性,perl很早就是linux标配了,python这些年也成了一些linux发行版的标配,至于mac os,它默认安装了perl、python、ruby、php、java等主流编程语言。

特殊变量列表
变量	含义
$0	当前脚本的文件名
$n	传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#	传递给脚本或函数的参数个数。
$*	传递给脚本或函数的所有参数。
$@	传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?	上个命令的退出状态,或函数的返回值。
$$	当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

你可能感兴趣的:(linux shell script脚本)