Linux shell程序設計(五).變量-3
?
??? OK,變量問題的最后掃尾,包括了與變量相關的一些知識,不過也是重要的。
?
?
八、環境文件
?
??? bash的環境文件包括:.bash_profile文件、.bashrc文件、.bash_logout文件等
?
??? .bash_profile:設置化境變量和文件掩碼(umask),注冊后執行
??? .bashrc:只含有針對bash的腳本,可以用來設置別名,在.bash_profile之后執行
??? .bash_logout:退出注冊是執行,例如清屏等操作
?
??? 注:若是C shell,則相應文件為.login
?
?
九、export語句與環境設置
?
1、export語句
?
??? 在腳本或命令行中定義的變量(包括環境變量),僅在同一shell下有效,例如:
??? $ string="XXXX"
??? $ cat ex11
??????? echo "the name is $string"
??? $ ./ex11
??????? the name is
??? $ echo $string
??????? the name is XXXX
??? 可以看到,上面的例子中,定義的string變量僅在當前的shell下有效,而在ex11環境下為空。
?
??? export命令的作用就是將私有的變量export到轉出區
??? export [變量名]
?
??? 例如:
??? $ name="AAA"
??? $ export name
??? $ cat ex12
??????? name="BBB"
??????? echo "His name is $name"
??????? ex13
??? $ cat ex13
??????? echo "Her name is $name"
??? $ ./ex12
??????? His name is BBB
??????? Her name is AAA
?
??? 注:export在同一命令行中可以對應多個變量,例如:
??? $ export TERM PATH SHELL HOME
?
2、環境變量的設置和顯示
?
??? 直接設置變量的形式為:
[變量名]=值
??? 注意:如果含有空格等特殊字符,用""括起來
?
??? 可以使用不帶參數的export命令顯示本進程利用export命令所輸出的全部變量
??? $ export
??????? declare -x HOME="/home/oracle"
??????? declare -x HOSTNAME="localhost.localdomain"
??????? declare -x INPUTRC="/etc/inputrc"
??????? declare -x LANG="en_US.UTF-8"
??????? declare -x PWD="/home/oracle"
??????? declare -x SHELL="/bin/bash"
??????? declare -x SHLVL="2"
??????? declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
??????? declare -x SSH_CLIENT="::ffff:192.168.63.1 1474 22"
??????? declare -x SSH_CONNECTION="::ffff:192.168.63.1 1474 ::ffff:192.168.63.3 22"
??????? declare -x SSH_TTY="/dev/pts/1"
??????? declare -x TERM="vt100"
??????? ... ...
??? 也可以使用env命令列出所有的化境變量(包括本進程和以前進程所輸出的變量)
??? $ env
??????? MAIL=/var/spool/mail/root
??????? PWD=/home/oracle
??????? INPUTRC=/etc/inputrc
??????? LANG=en_US.UTF-8
??????? SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
??????? HOME=/home/oracle
??????? SHLVL=2
??????? LOGNAME=oracle
??????? SSH_CONNECTION=::ffff:192.168.63.1 1474 ::ffff:192.168.63.3 22
??????? LESSOPEN=|/usr/bin/lesspipe.sh %s
??????? G_BROKEN_FILENAMES=1
??????? OLDPWD=/root
??????? ... ...
?
3、set命令
?
??? set命令的功能有三個:
?
??? ① 顯示迄今為止所有定義的變量,包括局部變量和公用變量
??? ② 設定位置參數的值
??? ③ 改變執行shell腳本時的選項設定
?
??? 功能①即使用不帶參數的set命令
??? 功能②見上文
??? 功能③說明如下:
?
??? 設置標志:set -標志
??? 關閉標志:set +標志
?
??? 標志說明:
?
??? -x:命令打印,并在前面加“+”
??? -v:所有命令均打印出來
??? -a:對被修改、創建的變量自動標記,表明要被export到后繼名命令的環境中
??? -e:命令以非0狀態終止時退出shell(循環/if語句除外)
??? -f:禁止路徑名擴展
??? -h:記住命令位置,便于查找(默認打開)
??? -k:把全部以賦值語句形式出現的參數放在命令的環境中
??? -n:讀命令,但不執行???
?
?
十、參數置換變量
?
??? 參數置換變量是另一種為參數復制的方式,形式為:
??? [變量2]=${[變量1]op[字符串]}?? op in
[ :- | := | :+ | :? ]
?
??? 注:op兩邊不能有空格
?
1、[變量2]=${[變量1]:-[字符串]}
?
??? 如果[變量1]為空,則[變量2]=[字符串],[變量1]不變;否則[變量2]=[變量1],[變量1]不變
?
??? 舉例:
??? $ cat ex15
??????? echo -n "Please enter TERM1(default is ansi)->"
??????? read terminal
??????? TERM1=${ terminal:-ansi }
??????? echo "terminal type is $TERM1 now."
??????? echo "terminal=$terminal"
??? $ ./ex15
??????? Please enter TERM1(default is ansi)->(按Enter鍵)
??????? terminal type is ansi now.
??????? terminal=
??? $ ./ex15
??????? Please enter TERM1(default is ansi)->(vt100 按Enter鍵)
??????? terminal type is vt100 now.
??????? terminal=vt100
?
2、[變量2]=${[變量1]:=[字符串]}
?
??? 如果[變量1]為空,則[變量2]=[字符串],[變量1]=[字符串];否則[變量2]=[變量1],[變量1]不變
?
??? 舉例:
??? $ cat ex16
??????? echo -n "Please enter TERM2(default is ansi)->"
??????? read terminal
??????? TERM2=${ terminal:=ansi }
??????? echo "TERM2=${TERMS2}***terminal=$terminal"
??? $ ./ex16
??????? Please enter TERM2(default is ansi)->(按Enter鍵)
??????? TERM2=ansi***terminal=ansi
??? $ ./ex16
??????? Please enter TERM2(default is ansi)->(vt100 按Enter鍵)
??????? TERM2=vt100***terminal=vt100
?
3、[變量2]=${[變量1]:+[字符串]}
?
??? 如果[變量1]為空,則[變量2]為空,[變量1]不變;否則[變量2]=[字符串],[變量1]不變
?
??? 舉例:
??? $ cat ex17
??????? echo -n "Please enter TERM3(default is ansi)->"
??????? read terminal
??????? TERM3=${ terminal:+ansi }
??????? echo "TERM3=${TERMS3}!!!terminal=$terminal"
??? $ ./ex17
??????? Please enter TERM3(default is ansi)->(按Enter鍵)
??????? TERM3=!!!terminal=
??? $ ./ex17
??????? Please enter TERM3(default is ansi)->(vt100 按Enter鍵)
??????? TERM3=ansi!!!terminal=vt100
?
4、[變量2]=${[變量1]:?[字符串]}
?
??? 如果[變量1]為空,則輸出 “[shell腳本名]:[變量1]:[字符串]”;否則[變量2]=[變量1],[變量1]不變
?
??? 舉例:
??? $ cat ex18
??????? echo -n "Please enter TERM4(default is ansi)->"
??????? read terminal
??????? TERM4=${ terminal:+ansi }
??????? echo "TERM4=${TERMS4}\$\$\$terminal=$terminal"
??? $ ./ex18
??????? Please enter TERM4(default is ansi)->(按Enter鍵)
??????? ex18:terminal:ansi
??? $ ./ex18
??????? Please enter TERM3(default is ansi)->(vt100 按Enter鍵)
??????? TERM3=ansi$$$terminal=vt100
?
??? 注:顯示的[變量1]是其名稱,而不是它的值。
?
?