if

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    非空串

####################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  expr 5 \* 6 (即: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[*]}
##############判断变量是否为数字###########
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'     结束着色

---------------------------------------------------------------------------------------
while [ 0 ] 
do 
echo -en "\033[44;37m"
  sleep 0.05
   a="|"
   echo -ne "Please wait        ${a} \r"
  sleep 0.05
   b="/"
   echo -ne "Please wait        ${b} \r"
  sleep 0.05
   c="-"
   echo -ne "Please wait        ${c} \r"
  sleep 0.05
   d="\\"
   echo -ne "Please wait        ${d} \r"
echo -en "\033[0m"
i=$((($i+1)%40))
if [ $i -eq 39 ]
then
 continue
fi
done
##################################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
###########################################贪吃蛇游戏关键函数######################################
function DetectInput //判断输入的数据,控制方向
{
while [[ 1 ]]
do
c=""
read -n 1 c //读取输入的字母
echo -ne "\r \r" //清除输入的字母
if [[ $c == "a" || $c == "j" || $c == "A" || $c == "J" ]]
then
kill -36 $pidShowSnake //改变贪吃蛇的运动轨迹
elif [[ $c == "w" || $c == "i" || $c == "W" || $c == "I" ]]
then
kill -37 $pidShowSnake
elif [[ $c == "d" || $c == "l" || $c == "D" || $c == "L" ]]
then
kill -38 $pidShowSnake
elif [[ $c == "s" || $c == "k" || $c == "S" || $c == "K" ]]
then
kill -39 $pidShowSnake
elif [[ $c == "q" || $c == "Q" ]]
then
echo Quit.
done
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值