if判断 .
2012-11-24 16:16 8人阅读 评论(0) 收藏 编辑 删除
-b file 若文件存在且是一个块特殊文件,则为真
-c file 若文件存在且是一个字符特殊文件,则为真
-d file 若文件存在且是一个目录,则为真
-e file 若文件存在,则为真
-f file 若文件存在且是一个规则文件,则为真
-g file 若文件存在且设置了SGID位的值,则为真
-h file 若文件存在且为一个符合链接,则为真
-k file 若文件存在且设置了"sticky"位的值
-p file 若文件存在且为一已命名管道,则为真
-r file 若文件存在且可读,则为真
-s file 若文件存在且其大小大于零,则为真
-u file 若文件存在且设置了SUID位,则为真
-w file 若文件存在且可写,则为真
-x file 若文件存在且可执行,则为真
-o file 若文件存在且被有效用户ID所拥有,则为真
-z string 若string长度为0,则为真
-n string 若string长度不为0,则为真
string1 = string2 若两个字符串相等,则为真
string1 != string2 若两个字符串不相等,则为真
int1 -eq int2 若int1等于int2,则为真
int1 -ne int2 若int1不等于int2,则为真
int1 -lt int2 若int1小于int2,则为真
int1 -le int2 若int1小于等于int2,则为真
int1 -gt int2 若int1大于int2,则为真
int1 -ge int2 若int1大于等于int2,则为真
!expr 若expr为假则复合表达式为真。expr可以是任何有效的测试表达式
expr1 -a expr2 若expr1和expr2都为真则整式为真
expr1 -o expr2 若expr1和expr2有一个为真则整式为真
特殊变量
$0 正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径
$n 该变量与脚本被激活时所带的参数相对应。n是正整数,与参数位置相对应($1,$2…)
$# 提供脚本的参数号
$* 所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2
$@ 所有这些参数都分别被双引号引住。若一个脚本接收到两个参数,$@等价于$1$2
$? 前一个命令执行后的退出状态
$$ 当前shell的进程号。对于shell脚本,这是其正在执行时的进程ID
$! 前一个后台命令的进程号
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] 如果字符串不相等则为真。
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.
UNIX Shell 里面比较字符写法
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串
############################两个文件中存在相同的行####################
set -x
for string in `cat test.log`
do
for str in `cat tt.log`
do
if [[ "${string}" == "${str}" ]]
then
echo $string
fi
done
done
####################dd命令的使用#########################
1.备份:
将本地的/dev/hdx整盘备份到/dev/hdy :dd if=/dev/hdx of=/dev/hdy
将/dev/hdx全盘数据备份到指定路径的image文件:dd if=/dev/hdx of=/path/to/image
备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径:dd if=/dev/hdx | gzip >/path/to/image.gz
2.恢复:
将备份文件恢复到指定盘:dd if=/path/to/image of=/dev/hdx
将压缩的备份文件恢复到指定盘 :gzip -dc /path/to/image.gz | dd of=/dev/hdx
参数说明:
if 输入设备或者文件
of 输出设备或文件
bs dd缓冲区。设定dd时一次io拷贝多少数据,它与输入文件和输出文件的block size都没有直接联系。
一般来说,bs越大,拷贝速度越快
skip 设定dd时从输入文件中跳过多少个dd缓冲区开始拷贝数据。一般在裸设备有offset时使用
seek 设定dd时从输出文件中跳过多少个dd缓冲区开始写入数据。一般在裸设备有offset时使用
count 设置dd的io数量。如果省略了count,表示完全拷贝输入文件到输出文件上
dd参数适用范围:
备份源 备份目的地 适用参数
裸设备 裸设备 if of bs skip seek count
裸设备 文件系统 if of bs skip count
文件系统 裸设备 if of bs seek
文件系统 文件系统 if of bs
首先要了解两个特殊的设备:
/dev/null:回收站、无底洞
/dev/zero:产生字符
测试磁盘写能力
time dd if=/dev/zero of=/test.dbf bs=8k count=300000
因为/dev/zero是一个伪设备,它只产生空字符流,对它不会产生IO,所以,IO都会集中在of文件中,of文件只用于写,所以这个命令相当于
测试磁盘的写能力。
测试磁盘读能力
time dd if=/dev/sdb1 of=/dev/null bs=8k
因为/dev/sdb1是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,所以,这个命令的IO只发
生在/dev/sdb1上,也相当于测试磁盘的读能力。
测试同时读写能力
time dd if=/dev/sdb1 of=/test1.dbf bs=8k
这个命令下,一个是物理分区,一个是实际的文件,对它们的读写都会产生IO(对/dev/sdb1是读,对/test1.dbf是写),假设他们都在一个
磁盘中,这个命令就相当于测试磁盘的同时读写能力。
##############################netcat使用####################################
利用netcat远程备份:
在源主机上执行此命令备份/dev/hda:dd if=/dev/hda bs=16065b | netcat < targethost-IP > /opt
在目的主机上执行此命令来接收数据并写入/dev/hdc:netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
以下两条指令是目的主机指令的变化分别采用bzip2 gzip对数据进行压缩,并将备份文件保存在当
前目录 :
netcat -l -p 1234 | bzip2 > partition.img
netcat -l -p 1234 | gzip > partition.img
1,端口扫描
端口扫描经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。
$netcat -z -v -n 172.31.100.7 21-25
可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp.
z 参数告诉netcat使用0 IO,连接成功后立即关闭连接, 不进行数据交换(谢谢@jxing 指点)
v 参数指使用冗余选项(译者注:即详细输出)
n 参数告诉netcat 不要使用DNS反向查询IP地址的域名
$netcat -v 172.31.100.7 21netcat 命令会连接开放端口21并且打印运行在这个端口上服务的banner信息。
####################清楚文件中空白行#########################
于是使用sed, 查了下命令,这么写:
sed '/^$/d' file1
发现仍然输出内容仍然有一大堆空行,真是莫名其妙。
于是:sed '/^$/p' file1 发现输出的空行很少,而实际上是很多空行的呀。
于是使用 cat -A file1
才发现,原来很多行里出现空格字符,导致正则并不识别它是空行
于是修改为: sed '/^ *$/d' file1 这下就OK啦
#######################获得字符串所在行的行号#################
awk "/$target/{print NR}" $path_x
grep -n "${target}" file|awk -F":" '{print $1}'
#############整形浮点型计算问题###############################
echo $((5+6))
expr 5 + 6
let varible=5+6
expr i=$i + 1 自增自减
let i++ 自增自减
let i-- 自增自减
value=`echo 1.5+1.6|bc` 浮点运算
value=`echo "scale=10;2/3"|bc` 浮点运算(scale为设置精度值)
##################进制转换###################
a=1006
x=`echo "obase=2;$a"|bc` 输出2进制(即10进制转换为2进制)
echo "obase10;ibase=2;$x"|bc 输出10进制(即2进制转换为10进制)
#############时间问题的处理#################
date --date='2 year ago' +%Y%m%d
date +"%Y%m%d" -d"+3 day" #在时间上加3天,日子往后推3天
date +%s -d "2013-02-06 12:15:56" #自从1970-1-1 0:0:0 到现在为止的时间转换为秒,以秒的形式体现
date -d @1360124156 "+%Y-%m-%d %H:%M:S" #自从1970-1-1 0:0:0 到现在为止秒的时间形式转换为"+%Y-%m-%d %H:%M:S",以日期格式体现
#############数组声明使用###################
var=(1 2 3 4 5)
echo ${var[下标号]}
#数组所有值
echo ${var[*]}
#数组长度
echo ${#var[*]}
################替换文本中某行字符串###########
替换文本mv_dailybuild.sh中12行的NastarV600R011C00SPC201 为 NastarV600R011C01B100
sed 12s/NastarV600R011C00SPC201/NastarV600R011C01B100/g mv_dailybuild.sh
对那些包含But字符串的行,把is替换成are
sed "/But/s/is/are/g" sedtest.txt
####################sed的重要用法#####################
★ 限定范围后的模式匹配
sed "/But/s/is/are/g" sedtest.txt
对那些包含But字符串的行,把is替换成are
sed "/is/s/t/T/" sedtest.txt
对那些包含is字符串的行,把每行第一个出现的t替换成T
sed "/While/,/from/p" sedtest.txt -n
输出在这两个模式匹配行之间的所有内容
★ 指定替换每一行中匹配的第几次出现
sed "s/is/are/5" sedtest.txt
把每行的is字符串的第5次出现替换成are
★ &代表最后匹配
sed "s/^$/(&)/" sedtest.txt
给所有空行增加一对()
sed "s/is/(&)/g" sedtest.txt
给所有is字符串外增加()
sed "s/.*/(&)/" sedtest.txt
给所有行增加一对()
sed "/is/s/.*/(&)/" sedtest.txt
给所有包含is字符串的行增加一对()
★ !号的使用
sed -e '3,7!d' sedtest.txt
删除3-7行之外的所有行
sed -e '1,/from/!d' sedtest.txt
找到包含from字符串的行,删除其后的所有行
★ \c正则表达式c 的使用
sed -e "\:from:d" sedtest.txt
等价于 sed -e "/from/d" sedtest.txt
★ sed命令中正则表达式的复杂性
cat > sedtest.txt
^\/[}]{.*}[\(]$\)
^D
如何才能把该行替换成
\(]$\)\/[}]{.*}^[
★ 转换man手册成普通文本格式(新)
man sed | col -b > sed.txt
sed -e "s/^H//g" -e "/^$/d" -e "s/^^I/ /g" -e "s/^I/ /g" sed.txt > sedman
txt
删除所有退格键、空行,把行首的制表符替换成8个空格,其余制表符替换成一个空格。
##############判断变量是否为数字###########
expr $a : '[0-9]+'
echo $a |grep -E '[^0-9]'
shell 判断变量是否为整数数字,等于0说明带入参数为数字
digit=`echo $a |awk '/^[0-9]*$/{print 0}'`
if [[ ! -z $digit ]]
then
return
fi
#################向os增加外置命令方法######
#!/bin/sh
curdir=`pwd`
script_name=$1
alias_name=$2
if [ ! -z $script_name ] && [ ! -z $alias_name ]
then
echo "alias $alias_name='$curdir/$script_name'" >>/etc/profile
sleep 0.5s
source /etc/profile
else
printf "check script input parameter!\n"
fi
exit
#################字符串去重用法##########################
echo "qu qu ji ji zha zha"|awk 'BEGIN{re=""}{for(i=1;i<=NF;i++) {if(!a[$i]){re=re""$i " ";a[$i]=$i}}}END{print re}' 方法一
#################tr用法#################################
echo xxx|tr [a-z] [A-Z] 大小写转换(小写转换为大写)
echo xxx|tr [A-Z] [a-z] 大小写转换(大写转换为小写)
##########################字符串截取###############################
echo qujinhua|awk '{print substr($0,2,3)}'
echo qujinhua|awk '{print substr($x,2,3)}'
expr substr qujinhua 2 3
expr length qujinhua
########################文本文件每行前添加字符串################################
sed -i "s/^/`date +%Y%m%d` /g" XXXX.log
echo $qujinhua|sed "s/^/`date +%Y%m%d`:/g"
#####################################XML操作##################################################################
cat xml.sql|awk '{if(/DBUser/){sub(/>[^<]*</,">sssssssssssssssssss<")}print}' >/root/resau/test/xml2.sql
########################echo和print控制输出格式###############################################################
echo “/usr/local/sbin/vsftpd &” >>/etc/rc.local
#!/bin/bash
a=0
while [ 1 ]
do
let a++
sleep 1s
echo -ne "renmindahuitang: $a qwe \r" #不换行刷新数据
done
echo参 数:
-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
--help 显示帮助
--version 显示版本信息
每一个shell支持的echo指令可能都不太相同。
-n 不输出最后的\n
-e解释转义字符
-E不解释转义字符
printf '\033[40;31m' 开始着色
printf '\033[0m' 结束着色
##################################expect相关用法####################################
expect -c '
spawn ssh '$1'@'$3' '$4' '$5' '$6' '$7' '$8' '$9'
expect
{
"(yes/no)?"
{
send "yes\n"
expect "*assword:" { send "'${2}'\n"}
}
"*assword:"
{send "'${2}'\n"}
}
expect eof
interact
wait'
--------------------------------------------------------------------
expect -c '
spawn scp -r '$4' '$1'@'$3':'$5'
expect {
"(yes/no)?"
{
send "yes\n"
expect "*assword:" { send "'$2'\n"}
}
"*assword:"
{send "'$2'\n"}
}
expect eof
wait'
#interact
------------------------------------------------------------------
expect -c "
set timeout 30;
spawn ssh user@ip ls -l;
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*password*\" {send \"$passwd\r\";}
}
expect eof;"
------------------------------------------------------------------
{
echo Changeme_123
sleep 1s
echo Changeme_123
} |passwd root
{
echo Changeme_123
}| su - omcuser -c '
echo `whoami`'
------------------------------------------------------------------
###############################密码输入为星号#######################################
STTY_RESTORE=$(stty -g)
echo -n "please ftp user Password: "
stty -echo cbreak
while true
do
character=$(dd if=/dev/tty bs=1 count=1 2> /dev/null)
case $character in
$(echo -e "\n"))
break
;;
$(echo -e "\b"))
if [ -n "$password" ]; then
echo -n -e "\b \b"
password=$(echo "$password" | sed 's/.$//g')
fi
;;
*)
password=$password$character
echo -n '*'
;;
esac
done
stty $STTY_RESTORE #stty -cbreak echo
stty echo
decryptstr=$password
export decryptstr
###############################ftp上传下载#######################################
ftp -i -n -v 10.144.199.190 <<EOF >/reu/log.log 2>&1
user ftpuser nastar@123
bin
cd /opt
#mget
get RS_V600R009C00SPC510B001.tar.gz
close
bye
EOF
上传的ftp用户最好有root权限,防止上传文件无创建权限
ftp -n 192.168.88.251 << EOF
user user password
bin
lcd /u01/backup/backuptmp
prompt
#put
mput *
bye
EOF