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