??xml version="1.0" encoding="utf-8" standalone="yes"?>
HOME
HOSTNAME
LANG
LC_CTYPE
MAIL
PS1
PATH
PWD
SHELL
TERM
UID
MAIL
在shell里可以直接引用这些变量,? echo $UID
]]>
if [ 条g判断?]; then
当条件判断式成立Ӟ可以q行的指令工作内容;
fi
如果考虑更复杂的情况Q则可以使用q个语法Q?br />
if [ 条g判断?]; then
当条件判断式成立Ӟ可以q行的指令工作内容;
else
当条件判断式不成立时Q可以进行的指o工作内容Q?br />
fi
shell举例Q?br />
if [ 条g判断式一 ]; then
当条件判断式一成立Ӟ可以q行的指令工作内容;
elif [ 条g判断式二 ]; then
当条件判断式二成立时Q可以进行的指o工作内容Q?br />
else
当条件判断式一与二均不成立Ӟ可以q行的指令工作内容;
fi
read -p "Please input (Y/N): " yn
if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
echo "OK, continue"
elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
echo "Oh, interrupt!"
else
echo "I don't know what is your choise"
fi
2?span class="text_h2">利用 case ..... esac 判断
case $变数名称 in
"W一个变数内?)
E式D?br />
;;
"W二个变数内?)
E式D?br />
;;
*)
不包含第一个变数内容与W二个变数内容的其他E式执行D?br />
exit 1
;;
esac
case $1 in
"hello")
echo "Hello, how are you ?"
;;
"")
echo "You MUST input parameters, ex> $0 someword"
;;
*)
echo "Usage $0 {hello}"
;;
esac
3?span class="text_h2">利用 function 功能
注意Qfunction 的设定一定要在程式的最前面
function fname() {
E式D?br />
}
function printit(){
echo "Your choice is $1"
}
echo "This program will print your selection !"
case $1 in
"one")
printit 1
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage {one|two|three}"
;;
esac
4?span class="text_h1">loop
?condition 条g成立Ӟp行@环,直到 condition 的条件不成立才停?/span>?br />
while [ condition ]
do
E式D落
done
?condition 条g成立Ӟq止@环, 否则持l进行?br />
until [ condition ]
do
E式D落
done
while [ "$yn" != "yes" ] && [ "$yn" != "YES" ]
do
read -p "Please input yes/YES to stop this program: " yn
done
until [ "$yn" == "yes" ] || [ "$yn" == "YES" ]
do
read -p "Please input yes/YES to stop this program: " yn
done
5?span class="text_h2">for...do....done
for (( 初始?span class="term_write">; 限制?span class="term_write">; 执行步阶 ))
do
E式D?br />
done
s=0 |
for $var in con1 con2 con3 ... |
for animal in dog cat elephant |
# 1. 先看看这个目录是否存在啊Q?/span>
|
[root@linux ~]# echo $HOME [root@linux ~]# echo ${HOME} |
那么Q在那个 ${variable} 的用方法中Q其实,我们q可以将变数q行一些修订的工作喔! 只要加上一些字W标志,后面再接着使用比对字串Q就能够修改变数的内容了Q我们取底下的例子来说明Q在底下的例子中Q假设我的变数名UCؓ vbird Q且内容?/home/vbird/testing/testing.x.sh?/span>
1. 完整呈现 vbird q个变数的内容; [root@linux ~]# vbird="/home/vbird/testing/testing.x.sh" [root@linux ~]# echo ${vbird} /home/vbird/testing/testing.x.sh 2. ?vbird 变数中,从最前面开始比对,若开头ؓ / Q则删除两个 / 之间的所有资料,亦即 /*/ [root@linux ~]# echo ${vbird##/*/} testing.x.sh <==删除?/home/vbird/testing/ [root@linux ~]# echo ${vbird#/*/} vbird/testing/testing.x.sh <==仅删?/home/ 而已 # q两个小例子有趣了~变数名称后面如果接了两个 ## Q表C在 ## # 后面的字串取‘最长的’那一D;如果仅有一?# Q表C取‘最的那一D?#8217;喔! 3. 呈上题,如果是从后面开始,删除 /* 呢? [root@linux ~]# echo ${vbird%%/*/} /home/vbird/testing/testing.x.sh <==都没被删?/span> [root@linux ~]# echo ${vbird%%/*} <==被删除光了! [root@linux ~]# echo ${vbird%/*} /home/vbird/testing <==只删?/testing.x.sh 部分 # q个例子当中需要特别注意,那个 % 比对的是‘最后面那个字元’的意思, # 所以啰Q第一个方式当然不对~因ؓ vbird q个变数的内Ҏ后面?h 而不?/ 啊! # 至于 %%/* 则是删除‘最长的那个 /* ’Q当然就是全部喔Q?%/* 则是最短的那个Q?/span> 4. ?vbird 变数中的 testing 取代?TEST [root@linux ~]# echo ${vbird/testing/TEST} /home/vbird/TEST/testing.x.sh [root@linux ~]# echo ${vbird//testing/TEST} /home/vbird/TEST/TEST.x.sh # 如果变数后面接的?/ Ӟ那么表示后面是进?#8216;取代’的工作~而且仅取?#8216;W一?#8217; # 但如果是 // Q则表示全部的字串都取代啊! |
q里您稍微留意一下就好了~反正就是变数后面可以接 #, ##, %, %%, /, // Q?而他们存在的意义q不相同的啦?span>
另外Q几个不同的变数内容q可以进行判断呢Q?举例来说Q目前我需要用C个变敎ͼ分别?var ?str Q?那我惌针对 str q个变数内容是否有设定成一个字Ԍ亦即 "expr" 来决?var 的内宏V?那我可以使用什么方法来q行判断呢?如果您会?shell script 的话Q?直接?shell script 好了,如果不会写,那么我们透过单的变数判断吧!
Tips: |
|
变数讑֮方式 |
str 没有讑֮ |
str 为空字串 |
str 已设定非为空字串 |
var=${str-expr} |
var=expr |
var= |
var=$str |
var=${str:-expr} |
var=expr |
var=expr |
var=$str |
var=${str+expr} |
var=expr |
var=expr |
var=expr |
var=${str:+expr} |
var=expr |
var= |
var=expr |
var=${str=expr} |
str=expr |
str 不变 |
str 不变 |
var=${str:=expr} |
str=expr |
str=expr |
str 不变 |
var=${str?expr} |
expr 输出?stderr |
var= |
var=str |
var=${str:?expr} |
expr 输出?stderr |
expr 输出?stderr |
var=str |
Ҏ上面q张表,我们来进行几个范例的l习吧! ^_^
范例一Q若 str q个变数内容存在Q则 var 讑֮?str Q否?span> var 讑֮?"newvar" [root@linux ~]# unset str; var=${str-newvar} [root@linux ~]# echo var="$var", str="$str" var=newvar, str= <==因ؓ str 不存在,所?var ?newvar [root@linux ~]# str="oldvar"; var=${str-newvar} [root@linux ~]# echo var="$var", str="$str" var=oldvar, str=oldvar <==因ؓ str 存在Q所?var {于 str 的内?/span> 范例二:?str 不存在,?var ?str 均设定ؓ newvarQ否则仅 var ?newvar [root@linux ~]# unset str; var=${str=newvar} [root@linux ~]# echo var="$var", str="$str" var=newvar, str=newvar <==因ؓ str 不存在,所?var/str 均ؓ newvar [root@linux ~]# str="oldvar"; var=${str=newvar} [root@linux ~]# echo var="$var", str="$str" var=oldvar, str=oldvar <==因ؓ str 存在Q所?var {于 str 的内?/span> 范例三:?str q个变数存在Q则 var {于 str Q否则输?span> "novar" [root@linux ~]# unset str; var=${str?novar} -bash: str: novar <==因ؓ str 不存在,所以输出错误讯? [root@linux ~]# str="oldvar"; var=${str?novar} [root@linux ~]# echo var="$var", str="$str" var=oldvar, str=oldvar <==因ؓ str 存在Q所?var {于 str 的内?/span> # 上面q三个案例都没有提到?str 有设定,且ؓI字串的情况喔! # 您可以自行测试一下哩Q?/span> |
虽然猛一看,觉得变数没有什么奇特的地方Q但是,如果仔细瞧一瞧,嘿!一堆环境变Cpȝ资源斚w的变敎ͼ 可是会媄响到我们?bash 里头是否能够利作业的呢Q例?PATH 啊、ulimit 之类的~ 所以,您还是得要了解变数这个玩意才行喔Q?^_^
使用最多的是下面两个
var=${str-expr}Q只要有输入Q就使用输入的|哪怕输入ؓI字W串Q否则用expr的默认?br />
var=${str:-expr}Q只有输入非I字W串Ӟ才用输入|否则使用expr的默认?/span>
试的标?/td> | 代表意义 |
1. 关于某个名?#8216;cd’侦测(存在与否)Q如 test -e filename | |
-e | ?#8216;名’是否存在Q?常用) |
-f | ?#8216;档名’是否为?file)Q?常用) |
-d | ?#8216;档名’是否为目?directory)Q?常用) |
-b | ?#8216;名’是否Z?block device 装置Q?/td> |
-c | ?#8216;档名’是否Z?character device 装置Q?/td> |
-S | ?#8216;档名’是否Z?Socket 案Q?/td> |
-p | ?#8216;档名’是否Z?FIFO (pipe) 案Q?/td> |
-L | ?#8216;档名’是否Z个连l档Q?/td> |
2. 关于案的权限侦,?test -r filename | |
-r | 侦测该名是否具?#8216;可读’的属性? |
-w | 侦测该名是否具?#8216;可写’的属性? |
-x | 侦测该名是否具?#8216;可执?#8217;的属性? |
-u | 侦测该档名是否具?#8216;SUID’的属性? |
-g | 侦测该档名是否具?#8216;SGID’的属性? |
-k | 侦测该名是否具?#8216;Sticky bit’的属性? |
-s | 侦测该名是否ؓ‘非空白?#8217;Q?/td> |
3. 两个档案之间的比较,如: test file1 -nt file2 | |
-nt | (newer than)判断 file1 是否?file2 ?/td> |
-ot | (older than)判断 file1 是否?file2 ?/td> |
-ef | 判断 file2 ?file2 是否为同一档案Q可用在判断 hard link 的判定上?主要意义在判定,两个案是否均指向同一?inode 哩! |
4. 关于两个整数之间的判定,例如 test n1 -eq n2 | |
-eq | 两数值相{?(equal) |
-ne | 两数g{?(not equal) |
-gt | n1 大于 n2 (greater than) |
-lt | n1 于 n2 (less than) |
-ge | n1 大于{于 n2 (greater than or equal) |
-le | n1 于{于 n2 (less than or equal) |
5. 判定字串的资?/td> | |
test -z string | 判定字串是否?0 Q若 string 为空字串Q则?true |
test -n string | 判定字串是否非ؓ 0 Q若 string 为空字串Q则?false?br /> 注: -n 亦可省略 |
test str1 = str2 | 判定 str1 是否{于 str2 Q若相等Q则回传 true |
test str1 != str2 | 判定 str1 是否不等?str2 Q若相等Q则回传 false |
6. 多重条g判定Q例如: test -r filename -a -x filename | |
-a | (and)两状况同时成立!例如 test -r file -a -x fileQ则 file 同时h r ?x 权限Ӟ才回?true?/td> |
-o | (or)两状况Q何一个成立!例如 test -r file -o -x fileQ则 file h r ?x 权限Ӟ可回传 true?/td> |
! | 反相状态,?test ! -x file Q当 file 不具?x Ӟ回传 true |
[root@linux ~]# name="VBird Tsai" [root@linux ~]# [ $name == "VBird" ] bash: [: too many arguments |