(1)linux判断文件是否存在
if [ -f filename]; then
。。。。。。#要执行的语句
fi
具体例子:
file=/usr/local/oracle/oradata/archived_log/file.txt
if [ -f $file ];then #判断文件是否存在,存在就追加
echo $file_i >> $file
else #否则复写
echo $file_i > $file
fi
fi
(2)按行读取文件
record=/usr/local/oracle/oradata/archived_log/recordarch
file=/usr/local/oracle/oradata/archived_log/file.txt
for file_i in `cat $record`;
do
echo $file_i
scp -C $file_i aaa@192.168.1.106:/d:/redo
flag=$(echo $?) #判断SCP是否发送成功,成功返回0
if [ $flag -eq 0 ];then
#rm $file_i
sed -i '/'''$file_i'''/d' $record
echo "success delete $file_i"
if [ -f $file ];then #判断文件是否存在,存在就追加
echo $file_i >> $file
else #否则复写
echo $file_i > $file
fi
fi
done
(3)从一个文件夹读取文件
#!/bin/bash
#coding=utf8
record=/usr/local/oracle/oradata/archived_log/recordarch
cd /usr/local/oracle/archive/
for file_i in `find ./ -mmin -1|grep 'dbf'`; #在当前目录下查找包含dbf的在一分钟内生成的文件
do
#cp $file_i /usr/local/oracle/oradata/archived_log
file_changed=$(echo $file_i |awk -F '/' '{print $2}') #去掉./ awk用法
echo $file_changed
echo $file_changed >> $record
done
(4)cut和awk用法,字符串分隔方法。
start_s=$(echo $start | cut -d '.' -f 1) #以,分割,-f指打印,1指分割后的第一部分
time2=$(echo "$time" | awk '{print $1/1000.0}')
str1=echo $string | cut -d ' ' -f1 #将输入的字符串根据空格分割,取第一个字段(field)
可以打印动态的位置方法:
for((i=1;i<=7;i++))
do
echo $user|cut -d ":" -f$i
done
将以:分隔的字符串分别输出,这种方法不需要知道个数。
- #!/bin/bash
- user=’mark:x:0:0:this is a test user:/var/mark:nologin’
- i=1
- while((1==1))
- do
- split=`echo $user|cut -d ":" -f$i`
- if [ "$split" != "" ]
- then
- ((i++))
- echo $split
- else
- break
- fi
- done
问题:对于’1,2,3,4,5’这样的字符串输出采用,分隔开的1 2 3 4 5
特征:在字符串中没有空格
解决方法1:
- #!/bin/bash
- var=’1,2,3,4,5’
- var=${var//,/ } #这里是将var中的,替换为空格
- for element in $var
- do
- echo $element
- done
(5) 按行读取和按行删除文件
写法一:
----------------------------------------------------------------------------
#!/bin/bash
while read line
do
echo $line
done < filename(待读取的文件)
----------------------------------------------------------------------------
写法二:
----------------------------------------------------------------------------
#!/bin/bash
cat filename(待读取的文件) | while read line
do
echo $line
done
----------------------------------------------------------------------------
写法三:
----------------------------------------------------------------------------
for line in `cat filename(待读取的文件)`
do
echo $line
done
----------------------------------------------------------------------------
说明:
for逐行读和while逐行读是有区别的,如:
$ cat file
1111
2222
3333 4444 555
$ cat file | while read line; do echo $line; done
1111
2222
3333 4444 555
$ for line in $(<file); do echo $line; done
1111
2222
3333
4444
555
shell删除某一行
如果有一个abc.txt文件,内容是:
aaa
bbb
ccc
ddd
eee
fff
如果要删除aaa,那么脚本可以这样写:
sed -i '/aaa/d' abc.txt
如果删除的是一个变量的值,假如变量是var,应该写成:
sed -i '/'"$var"'/d' abc.txt 注意这里是三个'''
至于grep -v aaa abc.txt这个方法,是无法将修改的结果写入abc.txt中去的
(6) 判断一个文件是否存在(重复了,上面有啦)
if [ -f "filename" ];then #这里的filename可以加上路径
...
fi
将一个文件追加到另一个文件
cat file1 >> file2 #>>追加,>为覆盖
补充例子:
#!/bin/sh
myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"
#这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -x "$myPath"]; then
mkdir "$myPath"
fi
#这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPath"]; then
mkdir "$myPath"
fi
#这里的-f参数判断$myFile是否存在
if [ ! -f "$myFile" ]; then
touch "$myFile"
fi
#其他参数还有-n,-n是判断一个变量是否是否有值
if [ ! -n "$myVar" ]; then
echo "$myVar is empty"
exit 0
fi
#两个变量判断是否相等
if [ "$var1" = "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi
========================================
shell 判断语句
流程控制 "if" 表达式 如果条件为真则执行then后面的部分: if ....; then
....
elif ....; then
....
else
....
fi
大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等… 通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等 -r file 用户可读为真
-w file 用户可写为真
-x file 用户可执行为真
-f file 文件为正规文件为真
-d file 文件为目录为真
-c file 文件为字符特殊文件为真
-b file 文件为块特殊文件为真
-s file 文件大小非0时为真
-t file 当文件描述符(默认为1)指定的设备为终端时为真
######################################################### 含条件选择的shell脚本
对于不含变量的任务简单shell脚本一般能胜任。但在执行一些决策任务时,就需要包含if/then的条件判断了。shell脚本编程支持此类运算,包
括比较运算、判断文件是否存在等。基本的if条件命令选项有: -eq —比较两个参数是否相等(例如,if [ 2 –eq 5 ])
-ne —比较两个参数是否不相等
-lt —参数1是否小于参数2
-le —参数1是否小于等于参数2
-gt —参数1是否大于参数2
-ge —参数1是否大于等于参数2
-f — 检查某文件是否存在(例如,if [ -f "filename" ])
-d — 检查目录是否存在
几
乎所有的判断都可以用这些比较运算符实现。脚本中常用-f命令选项在执行某一文件之前检查它是否存在。
##################################################################
判断文件是否存在 #!/bin/sh
today=`date -d yesterday +%y%m%d`
file="apache_$today.tar.gz"
cd /home/chenshuo/shell
if [ -f "$file" ];then
echo "OK"
else
echo "error $file" >error.log
mail -s "fail backup from test" <error.log
fi