2013年3月18日 星期一 晴

变量

一、编辑创建用户脚本

1、筛选用户是否已经建立

[root@desktop7 ~]# grep jerry /etc/passwd

2、创建用户

[root@desktop7 ~]#vim createuser.sh(/bin/bash)(可登录系统)

#!/bin/bash

#create user

#pate:cre

#auther:fengzhao001

#Version:

NAME=marry

U_ID=550

G_ID=550

echo "$NAME:x:$U_ID:$G_ID::/home/$NAME:/bin/bash">>/etc/passwd

echo "$NAME:!!:15781(2013-03-18):0:99999:7:::">>/etc/shadow

echo "$NAME:x:$G_ID:">>/etc/group

echo "$NAME:!::">>/etc/gshadow

cp /etc/skel/{.bash_logout,.bash_profile,.bashrc,.emacs} /home/$NAME

保存退出

3、为该文件赋予执行权限

[root@desktop7 ~]# chmod a+x createuser.sh

4、创建该用户目录

[root@desktop7 ~]# mkdir /home/marry

5、执行脚本文件

[root@desktop7 ~]# ./createuser.sh

6、验证

[root@desktop7 ~]# tail -3 /etc/passwd

gdm:x:42:42::/var/gdm:/sbin/nologin

chenglong:x:500:501::/home/chenglong:/bin/bash

marry:x:550:550::/home/:/bin/bash

[root@desktop7 ~]#

创建用户成功

二、设定变量

1、正确脚本文件

(1)、编辑脚本文件

[root@desktop7 ~]# vim mustpreset.sh

  1 #!/bin/bash

  2

  3 shopt -s -o nounset

  4

  5 declare Infomix=50

  6

  7 echo $Infomix

保存退出                

(2)、赋予权限

[root@desktop7 ~]# chmod a+x mustpreset.sh

(3)、执行脚本

 

[root@desktop7 ~]# ./mustpreset.sh

50

2、不产生报错信息的设置

(1)编辑脚本文件(去掉原第三行信息:shopt -s -o nounset)

[root@desktop7 ~]# vim mustpreset.sh

  1 #!/bin/bash

  2

  3 declare Infomix=50

  4

  5 echo $Informix                           #加上字母r

 

(2)执行脚本文件

[root@desktop7 ~]# ./mustpreset.sh

[root@desktop7 ~]#

3、产生报错信息的设置

(1)、编辑脚本文件

[root@desktop7 ~]# vim mustpreset.sh

  1 #!/bin/bash

  2

  3 shopt -s -o nounset

  4

  5 declare Infomix=50

  6

  7 echo $Informix                            #加上字母r

保存退出

(2)执行脚本文件

[root@desktop7 ~]# ./mustpreset.sh

./mustpreset.sh: line 7: Informix: unbound variable

原第三行信息:shopt -s -o nounset

-s 打开选项:-o指可用set -o 设定的选项;后nounset指变量一定要先设定过,才能使用

set -o 可对系统进行操作

[root@desktop7 ~]# set -o

allexport       off

braceexpand     on

emacs           on

errexit         off

errtrace        off

functrace       off

hashall         on

histexpand      on

history         on

ignoreeof       off

interactive-comments    on

keyword         off

monitor         on

noclobber       off

noexec          off

noglob          off

nolog           off

notify          off

nounset         off

onecmd          off

physical        off

pipefail        off

posix           off

privileged      off

verbose         off

vi              off

xtrace          off

[root@desktop7 ~]#

nounset的用法,可避免手误,意即产生报错信息

当然,declare声明变量Infomix,可以省略

三、取得变量值

1、方法一:

[root@desktop7 ~]# I=8

[root@desktop7 ~]# J=$I

[root@desktop7 ~]# echo $J

8

[root@desktop7 ~]#

2、方法二:

[root@desktop7 ~]# echo ${J}

8

[root@desktop7 ~]#

3、转义$,作为正常符号使用

[root@desktop7 ~]# echo \$J

$J

[root@desktop7 ~]#

4、printf+”格式字符串“

[root@desktop7 ~]# HI="Hello,the World"

[root@desktop7 ~]# printf "%s""$HI"

Hello,the World[root@desktop7 ~]#

[root@desktop7 ~]#

5、以字符串的方式(%s之意),显示HI变量值的内容,但不换行

printf 本身不会自动换行,需加\n换行

[root@desktop7 ~]# printf "%s\n""$HI"

Hello,the World[root@desktop7 ~]#

[root@desktop7 ~]#

[root@desktop7 ~]# printf "%s" "abc\n"

abc\n[root@desktop7 ~]# printf "%s\n" "abc"

abc

[root@desktop7 ~]#

[root@desktop7 ~]#

[root@desktop7 ~]# printf "%s\n" "abc"

abc

[root@desktop7 ~]#

[root@desktop7 ~]# printf "%s\n" "abc"

abc

[root@desktop7 ~]# printf "%s" "abc"

abc[root@desktop7 ~]# printf "%s" "abc"

abc[root@desktop7 ~]# printf "%s\n" "abc"

abc

[root@desktop7 ~]# printf "%s\n\n" "abc"

abc

[root@desktop7 ~]# printf "\n%s\n\n" "abc"

abc

[root@desktop7 ~]#

6、转义特殊字符

[root@desktop7 ~]# SP="ABC 123 XYZ"

[root@desktop7 ~]# printf "%q\n" "$SP"

ABC\ 123\ XYZ

四、取消与清空变量

1、取消变量

unset [-v] 变量名称

 

[root@desktop7 ~]# unset SP

[root@desktop7 ~]# echo $SP

[root@desktop7 ~]#

unset [-f] 函数名称

2、清空变量

[root@desktop7 ~]# myname=fengzhao001

[root@desktop7 ~]# echo $myname

fengzhao001

[root@desktop7 ~]# myname=

[root@desktop7 ~]# echo $myname

[root@desktop7 ~]#

(占用资源,不建议使用)

五、变量和引号

1、双引号作用

(1)替换变量

(2)替换命令执行结果(稍后章节介绍)

(3)替换算术运算结果(稍后章节介绍)

2、双引号执行效果

[root@desktop7 ~]# vim shuangyinhao.sh

  1  #!/bin/bash

  2

  3 myname="fengzhao001"

  4

  5 HelloWorld="Hi,你好,我是$myname"

  6

  7 echo $HelloWorld

[root@desktop7 ~]# chmod a+x shuangyinhao.sh

[root@desktop7 ~]# ./shuangyinhao.sh

Hi,你好,我是fengzhao001

[root@desktop7 ~]#

3、单引号执行效果

[root@desktop7 ~]# vim danyinhao.sh

  1 #!/bin/bash

  2

  3 myname="fengzhao001"

  4

  5 HelloWorld='Hi,你好,我是$myname'

  6

  7 echo $HelloWorld

[root@desktop7 ~]# chmod a+x danyinhao.sh

[root@desktop7 ~]# ./danyinhao.sh

Hi,你好,我是$myname

[root@desktop7 ~]#

单引号的作用是形成一个所见即所得的字符串(写什么,显示什么),不会进行任何替换变量的操作。

4、抑制双引号中的替换变量

使用\转义$,取得变量值的作用

[root@desktop7 ~]# vim shuangyinhao.sh

  1 #!/bin/bash

  2

  3 myname="fengzhao001"

  4

  5 HelloWorld="Hi,你好,我是\$myname"           #在$前加转义字符\

  6

  7 echo $HelloWorld

~                     

[root@desktop7 ~]# ./shuangyinhao.sh

Hi,你好,我是$myname

[root@desktop7 ~]#

六、环境变量

1、环境变量

[root@desktop7 ~]# export

declare -x COLORTERM="gnome-terminal"

declare -x DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-9cStT7oYSC,guid=7c44be2c45db6de83ac8de005145beb8"

declare -x DESKTOP_SESSION="default"

declare -x DESKTOP_STARTUP_ID=""

declare -x DISPLAY=":0.0"

declare -x GDMSESSION="default"

declare -x GDM_XSERVER_LOCATION="local"

declare -x GNOME_DESKTOP_SESSION_ID="Default"

declare -x GNOME_KEYRING_SOCKET="/tmp/keyring-iDV5yC/socket"

declare -x GTK_IM_MODULE="scim-bridge"

declare -x GTK_RC_FILES="/etc/gtk/gtkrc:/root/.gtkrc-1.2-gnome2"

declare -x G_BROKEN_FILENAMES="1"

declare -x HISTSIZE="1000"

declare -x HOME="/root"

declare -x HOSTNAME="desktop7.example.com"

declare -x INPUTRC="/etc/inputrc"

declare -x LANG="en_US.UTF-8"

declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"

declare -x LOGNAME="root"

declare -x LS_COLORS="no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:"

declare -x MAIL="/var/spool/mail/root"

declare -x OLDPWD

declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin"

declare -x PWD="/root"

declare -x QT_IM_MODULE="scim"

declare -x SESSION_MANAGER="local/desktop7.example.com:/tmp/.ICE-unix/3995"

declare -x SHELL="/bin/bash"

declare -x SHLVL="2"

declare -x SSH_AGENT_PID="4030"

declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"

declare -x SSH_AUTH_SOCK="/tmp/ssh-WhZWQB3995/agent.3995"

declare -x TERM="xterm"

declare -x USER="root"

declare -x WINDOWID="25165906"

declare -x XAUTHORITY="/tmp/.gdmTJHVTW"

declare -x XMODIFIERS="@im=SCIM"

[root@desktop7 ~]#

2、将变量输出变成环境变量

方法一:

[root@desktop7 ~]# myname=fengzhao001

[root@desktop7 ~]# export myname

[root@desktop7 ~]# bash

[root@desktop7 ~]# echo $myname

fengzhao001

[root@desktop7 ~]#

方法二:

[root@desktop7 ~]# declare -x myname=fengzhao001

[root@desktop7 ~]# echo $myname

fengzhao001

[root@desktop7 ~]#

3、取消环境变量

[root@desktop7 ~]# unset myname

[root@desktop7 ~]# echo $myname

[root@desktop7 ~]#

4、清空环境变量

[root@desktop7 ~]# myname=

[root@desktop7 ~]# echo $myname

[root@desktop7 ~]#

七、常用环境变量

[root@desktop7 ~]# cd $HOME

[root@desktop7 ~]# ls

anaconda-ks.cfg  Desktop             install-vserver  o

createuser.sh    install.log         mbox             shuangyinhao.sh

danyinhao.sh     install.log.syslog  mustpreset.sh

[root@desktop7 ~]#

[root@desktop7 ~]# echo $HOSTTYPE                  #主机类型

x86_64

[root@desktop7 ~]# echo $HOSTNAME                  #主机名

desktop7.example.com

[root@desktop7 ~]# echo $MACHTYPE                  #描述主机形态的GNU格式:CPU-公司-系统

x86_64-redhat-linux-gnu

[root@desktop7 ~]# echo $MAIL                      #邮件文件名

/var/spool/mail/root

[root@desktop7 ~]# echo $MAILCHECK                 #每隔多久检查一次邮件

60

[root@desktop7 ~]# echo $OSTYPE                    #执行bash的操作系统种类

linux-gnu

[root@desktop7 ~]# echo $LINENOB                   #script已执行到的行数

25

[root@desktop7 ~]# echo $PS1                       #PS1主提示符,默认如下,可修改

[\u@\h \W]\$

[root@desktop7 ~]# PS1=[root@fengzhao001~]#

[root@fengzhao001~]#pwd

/root

[root@fengzhao001~]#ls

anaconda-ks.cfg  Desktop             install-vserver  o

createuser.sh    install.log         mbox             shuangyinhao.sh

danyinhao.sh     install.log.syslog  mustpreset.sh

[root@fengzhao001~]#PS1=fengzhao001#

fengzhao001#echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

fengzhao001#

[root@desktop7 ~]# echo $PS2                       #PS2次提示符,默认为>

>

初始bash配置文件(学完shell即可自己完成一下编辑)

[root@desktop7 ~]# vim /etc/bashrc

  1 # /etc/bashrc

  2

  3 # System wide functions and aliases

  4 # Environment stuff goes in /etc/profile

  5

  6 # are we an interactive shell?

  7 if [ "$PS1" ]; then

  8   if [ -z "$PROMPT_COMMAND" ]; then

  9     case $TERM in

 10         xterm*)

 11                 if [ -e /etc/sysconfig/bash-prompt-xterm ]; then

 12                         PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm

 13                 else

 14             PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

 15                 fi

 16                 ;;

 17         screen)

 18                 if [ -e /etc/sysconfig/bash-prompt-screen ]; then

 19                         PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen

 20                 else

 21             PROMPT_COMMAND='printf "\033]0;%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

 22                 fi

 23                 ;;

 24         *)

 25                 [ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=/etc/sysconfig/bash-prompt-default

 26             ;;

 27     esac

 28   fi

 29   # Turn on checkwinsize

 30   shopt -s checkwinsize

 31   [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "

 32 fi

 33

 34 if ! shopt -q login_shell ; then # We're not a login shell

 35         # Need to redefine pathmunge, it get's undefined at the end of /etc/profile

 36     pathmunge () {

 37                 if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then

 38                         if [ "$2" = "after" ] ; then

 39                                 PATH=$PATH:$1

 40                         else

 41                                 PATH=$1:$PATH

 42                         fi

 43                 fi

 44         }

 45

 46     # By default, we want umask to get set. This sets it for non-login shell.

 47     # You could check uidgid reservation validity in

 48     # /usr/share/doc/setup-*/uidgid file

 49     if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then

 50        umask 002

 51     else

 52        umask 022

 53     fi

 54

 55         # Only display echos from profile.d scripts if we are no login shell

 56     # and interactive - otherwise just process them to set envvars

 57     for i in /etc/profile.d/*.sh; do

 58         if [ -r "$i" ]; then

 59             if [ "$PS1" ]; then

 60                 . $i

 61             else

 62                 . $i >/dev/null 2>&1

 63             fi

 64         fi

 65     done

 66

 67         unset i

 68         unset pathmunge

 69 fi

 70 # vim:ts=4:sw=4