1、Shell脚本运行原理
Linux Shell脚本类似于Windows的批处理,但它有着比Windows批处理强大很多的功能。Shell脚本实际上是一个Shell命令的堆叠,再配合上Shell的运算,条件判断,循环结构及逻辑判断等语法,使得Shell脚本程序实现强大的功能。那么Shell脚本是怎么运行的呢? 说到Shell脚本的运行我们就先要说说Shell是什么。我们从字面意思可以看出,Shell是一个壳,它即是操作系统提供给用户的管理操作系统的接口,类似于Windows中的Explorer(图形界面)或者cmd命令提示符工具(命令界面DOS),Shell使用的是一种命令语言,它是一种命令解释器,把用户输入的命令解释后然后送由内核进行处理。Linux中有很多不同的Shell程序,最常用的即bash(Bourne Again shell),它是Bourne shell的扩展,而bash脚本中首行的#! /bin/bash即是为了指明该脚本所使用的解释器。
2、变量
变量即可变更的量,它是一块指向内存的地址空间,用来存储用户输入的数据或者程序运行过程中产生的数值或者对象
bash环境下的变量
本地变量:
在Bash中输入SET命令可以看到所有本地定义的Shell变量,作用域为当前Shell进程
[[email protected] ~]# set BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu") BASH_VERSION=‘4.1.2(1)-release‘ COLORS=/etc/DIR_COLORS COLUMNS=116 DIRSTACK=() EUID=0 GROUPS=() G_BROKEN_FILENAMES=1 HISTCONTROL=ignoredups HISTFILE=/root/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/root HOSTNAME=localhost.localdomain HOSTTYPE=x86_64 IFS=$‘ \t\n‘ LANG=en LESSOPEN=‘|/usr/bin/lesspipe.sh %s‘ LINES=28 LOGNAME=root LS_COLORS=‘rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;...... MACHTYPE=x86_64-redhat-linux-gnu MAIL=/var/spool/mail/root MAILCHECK=60 OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin PIPESTATUS=([0]="0") PPID=2867 PROMPT_COMMAND=‘printf "\033]0;%[email protected]%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"‘ PS1=‘[\[email protected]\h \W]\$ ‘ PS2=‘> ‘ PS4=‘+ ‘ PWD=/root SELINUX_LEVEL_REQUESTED= SELINUX_ROLE_REQUESTED= SELINUX_USE_CURRENT_RANGE= SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=1 SSH_CLIENT=‘192.168.68.1 1116 22‘ SSH_CONNECTION=‘192.168.68.1 1116 192.168.68.138 22‘ SSH_TTY=/dev/pts/0 TERM=xterm UID=0 USER=root _=_ colors=/etc/DIR_COLORS ftp_proxy=ftp:[email protected]:3120
环境变量:
定义当前Shell运行的环境信息,如PATH、PWD、HOME等,作用域为当前Shell进程及其子进程;环境变量可以用env、printenv、export查看
位置参数变量:
在脚本中用于引用传递给脚本的参数;在函数中引用传递给函数的参数,$n ,n=0-9
局部变量:
由用户在程序中定义,作用于函数的执行过程
特殊变量:
$? 上一次执行的状态码
$0 脚本本身的名字
$# 脚本参数个数
$* 脚本参数列表,相当于"$1 $2 $3" ,传递了1个参数
[email protected] 参数列表,相当于"$1" "$2" "$3",相当于3个参数
$$ 脚本运行的进程ID
#!/bin/bash echo $# echo $0 echo $* echo [email protected] echo $$ for key in $* do echo $key done for key2 in "$*" do echo $key2 done for key3 in [email protected] do echo $key3 done for key4 in "[email protected]" do echo $key4 done
执行结果:
[[email protected] ~]# bash values.sh 3 2 1 3 values.sh 3 2 1 3 2 1 3700 ----values in $* without Quotation Marks----- 3 2 1 ----values in $* with Quotation Marks----- 3 2 1 ----values in [email protected] without Quotation Marks----- 3 2 1 ----values in [email protected] with Quotation Marks----- 3 2 1
变量的赋值: