shell编程常用语句

shell基础
#find name
#find ../ -name wc*

#find modify file time

#find ../ -mtime -1 -type f

#find mtime modify time atime access time ctime create time + is more than
-1 就是1小时以内 +1就是1小时以外的文件

#find ./ -name "[a-z]*"


#find ./ -name "[a-f][a-d][a-i]*"


#mode

#find . -perm 755

#find . -size +100c

#find . -name "ec*" -o -name "b*"

#find and exec
#find . -name "*.c" -exec rm {} \;


#find . -name "e*" -exec ls -l {} \;


#find . -name "e*" -exec grep "b" {} \;

#find minute
#find . -mmin -5


#find day + more than - less than
#find . -mtime -1

find . -used -2


a="Hello World"
b=2
echo "A" is $a
echo "B" is ${b}nd
a="Hello World"
b=2
echo "A" is $a
echo "B" is ${b}nd


#!/bin/bash
case $1 in
*.c) echo "this is C file";;
*.cpp) echo "this is cpp file";;
*.txt) echo "this is txt "
esac

cat echo.sh>backup_echo
cat echo.sh>>backup_echo


cat -b back_find


dd if=echo.sh of=dd_echo
find ./ -name "*ch*"


date +"Hour %H.%M"


diff echo.sh if.sh


dir=/home/wang
# 2>/dev/null dont output wrong message
if cd "$dir" 2>/dev/null
then
echo "Now in $dir"
else
echo "cant go to $dir"
fi


#!/bin/bash
# exe command must add ``
if [ -r echo.sh ];then
echo "can read"
fi


#call is ./file2.sh "echo.sh if.sh" add"" to be a one parameter or will be two
for element in $1
do
if [ -d $element -a -e $element ]
then
echo "this is directory $element"
elif [ -f $element -a -e $element ]
then
echo "this is file $element"
fi
done

for var in A B C;do
echo $var
done


a=`echo "Hello!"`
echo $a

b=`ls -l`
echo $b
echo "$b"


#!/bin/bash

function xyz
{
echo "this is function"
}
xyz


grep "echo" echo.sh |wc -l

#[] must have space expr must have space
var=2
var=`expr $var + 2`
if [ $var>=2 ];then
echo "success"
fi
echo $var


if grep -q echo echo.sh
then
echo "File contanins echo"
fi


#!/bin/bash
# string = must have space
i=2

if [ $i = 3 ];then
echo "success"
else
echo "wrong"
fi


#!/bin/bash
line=`grep "echo" echo.sh|wc -l`
echo $line
if [ $line="2" ];then
echo "success"
else
echo "fail"
fi

if [ `grep "echo" echo.sh|wc -l`="2" ];then
echo "success"
fi


# have problem
a=2
b=3
c=4

if [ $b = 3 -a $a>$b ]
then
echo "right"
else
echo "wrong"
fi

if [[ $b > $a&&$c >$b ]]
then
echo "right2"
fi


var1=hello
var2=world
if [ $1 = hello -a $2 = world ]
then
echo "right"
else
echo "wrong"
fi

a=80
let a=$a+20
echo "a is $a"


#!/bin/bash

ls -R


ls -l|cat>$(date +"ls_%d%H%M")


var=2
var=`expr $var + 2 `
var=$(($var+2))
echo $var


a=123
let a+=1
echo $a


let i=5**3

echo $i


#if $1 not add "" will have null string problem
#more than 9 ${10}


if [ -n "${1}" ]
then
echo $1
fi
if [ -n "$2" ]
then
echo $2
elif [ -z "$2" ]
then
echo "nullstring"
fi


#pass parameter in command line

echo $1


ps -ef |grep Ultraman


read line
echo $line

File=./echo.sh

{
read line1
read line2
}<$File

echo $line1
echo $line2


{
echo "Hello"
echo "world"
}>redirect.bak


cat echo.sh |sort

#[[]] is different with []
var=$1

if [[ $1 = z* ]]
then
echo "tru1"
fi

if [ $1 == z* ]
then
echo "true2"
fi


echo $HOME
echo $PATH
echo $1
echo $*
echo $0


echo $#


echo $UID
user=`id -nu`
echo $user


var1=123
var2=243
var3=110

echo "var1=$var1 var2=$var2 var3=$var3"

#variable use command must add ''
fileFirst=`ls`
echo $fileFirst

#line
wc -l echo.sh
#word
wc -w echo.sh
#character
wc -c echo.sh


#!/bin/bash
i=0
sum=0
while [ $i != "100" ]
do
i=$(($i+1))
sum=$(($i+$sum))
done

echo $i $sum


for ((a=1;a<10;a++))
do
echo $a
done

cat /etc/passwd|cut -d":" -f1


a=1
while ((a<100))
do
echo $a
let a=a+1
((a++))
done


# notice $1 "" or may be null string


if [ -n "$1" ] 测试是否空串
then
dir=$1
if [ ! -d $dir ]
then
dir=$PWD
echo "wrong directory"
fi
else
dir=$PWD
fi
echo $dir


exec echo "Next will not exe"

echo "Hello"


find c*|xargs grep "while"


for file in `find $PWD -type f`
do
echo $file
done>fileback


a=letter
letter=z

eval c=\$$a

echo $c


oldIFS=$IFS
IFS=:

while read name passwd uid gid fullname ignore
do
echo "$name ($fullname)"
done </etc/passwd
IFS=$oldIFS


#modify file name
# why can use *.$1 as a list because directory is a list

for filename in $PWD/*.$1
do
mv $filename ${filename%$1}$2
done


dir=$PWD

#is right
# $dir/* is /home/wang/* list all file
for file in $dir/*
do
if [[ $file = *.c ]]
then
filename=${file%.*c}
filename=${filename}.cpp
mv $file $filename
fi
done

printf "%d\n" 2

#number compare use le lt ge gt eq
MAXCOUNT=10
count=1

while [ $count -le $MAXCOUNT ]
do
number=$RANDOM
echo $count
echo $number
let count=count+1
done


#output script name without directory name


echo ${0##*/}
echo $0


var=$1
echo ${var#*00}

# ##lang match #short match


stringz=$1

echo ${stringz#a*C}

echo ${stringz##a*C}


#tail replace

stringz=abcABC123ABCabc

echo ${stringz%b*c}

echo ${stringz%%b*c}


var=abc123abcbbc

echo ${var/c/D}

echo ${var//c/D}


echo ${var/%c/D}


echo "select your favourite vegetable"

select var in apple orange banana
do
echo $var
break
done


var=`who|cut -d" " -f1`

for person in $var
do
write $person<hello
done


dir=$PWD
# $dir/* is /home/wang/* list all file
for file in $dir/*
do
if [[ $file = *.sh ]]
then
echo $file
fi
done


inum=`ls -i|grep cwhile.sh|awk '{print $1}'`

echo $inum


sleep 1000000&

echo "have done"


stringz="abcde"

echo ${#stringz}

echo `expr length $stringz`


#match

stringz=$1

echo `expr match "$stringz" 'a*'`


stringz=$1

echo `expr index "$stringz" C`


stringz=$1


echo `expr substr $stringz 2 4`

字符串长度
while read line
do
echo $line
echo ${#line}
done

字串替代
stringz=abcABC123ABCabc


echo ${stringz/abc/xyz}

echo ${stringz//abc/xyz}


echo ${stringz/#abc/xyz}

echo ${stringz/%abc/xyz}


time ls -l


cat translate|tr a-z A-Z

#tr translate rev reverse tac cat


tac translate

rev translate


type -a ls
which ls

#show the full path


wget www.google.cn
w3m www.google.cn


who|wc -l


find .. -name echo.sh|cat

echo "1"

find .. -name echo.sh|xargs cat

echo "2"


file *|grep showfile*|cut -d":" -f1|xargs wc -l


#limit pass parameter number


ls|xargs -n 8 echo


#{} is where to replace


ls a.cpp|xargs -i cp ./{} a.c

dir1=/etc
dir2=/bin

pushd $dir1
echo "now in `pwd`"


pushd $dir2
echo "now in `pwd`"

popd
echo "noe in `pwd`"

popd
echo "now in `pwd`"


shell理论
反引号的功能是命令替换,将反引号中的字符串做为命令来执行,我们在用shell编程时经常用的到 将系统命令的执行结果赋给一个变量


Shell if比较时候要加空格 if [ $i = 2 ] ;then ...


后台运行命令.一个命令后边跟一个&,将表示在后台运行.


Vim ctrl+H ctrl+J ctrl+I ctrl+M


在""中还是会发生变量替换,这被叫做部分引用,或叫弱引用.而在''中就不会发生变量替换,这叫做全引用,也叫强引用.
Echo ‘$hello’


• –b 当file存在并且是块文件时返回真
• -c 当file存在并且是字符文件时返回真
• -d 当pathname存在并且是一个目录时返回真
• -e 当pathname指定的文件或目录存在时返回真
• -f 当file存在并且是正规文件时返回真
• -g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
• -h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
• -k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
• -p 当file存在并且是命令管道时返回为真
• -r 当由pathname指定的文件或目录存在并且可读时返回为真
• -s 当file存在文件大小大于0时返回真
• -u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
• -w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
• -o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。

UNIX Shell 里面比较字符写法:
• -eq 等于
• -ne 不等于
• -gt 大于
• -lt 小于
• -le 小于等于
• -ge 大于等于
• -z 空串
• = 两个字符相等
• != 两个字符不等
• -n 非空串

“” ‘’ \用来禁止转义


如果点放在文件名的开头的话, 那么这个文件将会成为"隐藏"文件, 并且ls命令将不会正常的显示出这个文件.


shell进阶
#!/bin/bash
#read a file time

file=$1
timefile=./timelog

function usage
{
echo "wrong use function"
exit 1
}

function while_read
{
cat $file | while read Line
do
echo $Line
done
}

function while_read_bottom
{
while read Line
do
echo $Line
done<$file
}


function while_line
{
cat $file|while line Line
do
echo $Line
done
}

function while_line_bottom
{
while line Line
do
echo $Line
done<$file
}


function line_tidai
{
cat $file|while Line=`line`
do
echo $Line
done
}

if (($#!=1))
then
usage
fi

if [ -f $timefile ]
then
rm $timefile
fi

touch $timefile


echo -e "\nwhile_read\n"
time while_read>>$timefile

echo -e "\nwhile_read_bottom\n"
time while_read_bottom>>$timefile

echo -e "\nwhile_line\n"
time while_line>>$timefile

echo -e "\nwhile_line_bottom\n"
time while_line_bottom>>$timefile

echo -e "\nline_tidai\n"
time line_tidai>>$timefile


#!/bin/bash

cat /etc/passwd|cut -d":" -f 1,3


name=wang


echo "$name"
echo '$name'
echo "\\hello"
echo '\\hello'
echo "today is `date`"
echo 'today is `date`'


#!/bin/bash
df -h|tail -n +2|grep -v "/dev/sda[^3-9]"|grep -v "none"


""% `` \会进行变量替换 '' 直接输出


-h human readerable

-k kb


df -k
df -h


tail -n +2 打印从首行开始的第二行

grep -v 输出不匹配的行


ctrl+alt +F7 是图形化界面


Linux 远程需要sudo apt-get install openssh-sever
sudo apt-get install vnc4server

注意防火墙关掉
pstree 查看进程


deb包默认下载到 /var/cache/apt/archives

grep 注意正则表达式 有些 '' ""注意转义和*

$? 状态码
$# 参数数目
$! PID

终端浏览器w3m

正则表达式 \{2\} 表示重复2次 \{2,\} 表示重复2次以上


#!/bin/bash
#\ 表示一个命令可以换行而接续上一行的命令 用于长命令
#sed s 替换 s/ / /g g表示替换所有
FSMAX=15
WorkFile=./df.work
OutFile=./df.out


if [ -f $WorkFile ]
then
rm $WorkFile
fi

if [ -f $OutFile ]
then
rm $OutFile
fi

touch $WorkFile
touch $OutFile

df -h|tail -n +2|grep -v "/dev/sda[0-1]"|grep -v "none"|\
awk '{print $1,$5,$6}'>>df.work

while read fsdevice fsvalue fsmount
do
# fsvalue=`echo $fsvalue|sed s/\%//g`
#两种方式都可以使用 sed 和匹配法 注意 转义 \%
fsvalue=${fsvalue%\%}
if ((fsvalue>FSMAX)) 注意使用2个括号C的方式
then
echo "$fsdevice $fsvalue $fsmount">>df.out
fi
done<$WorkFile

#-s 如果文件存在
if [ -s $OutFile ]
then
cat $OutFile
fi


#!/bin/bash
#\ 表示一个命令可以换行而接续上一行的命令 用于长命令
#sed s 替换 s/ / /g g表示替换所有
FSMAX=15
WorkFile=./df.work
OutFile=./df.out
ExceptionFile=./fs_exception
DataException=./data_exception


if [ -f $DataException ]
then
rm $DataException
fi

if [ -f $WorkFile ]
then
rm $WorkFile
fi

if [ -f $OutFile ]
then
rm $OutFile
fi

touch $WorkFile
touch $OutFile
touch $DataException

df -h|tail -n +2|grep -v "/dev/sda[0-1]"|grep -v "none"|\
awk '{print $1,$5,$6}'>>df.work

NowMax=$FSMAX

#^表示开头 $表示结尾 去掉#注释行 和空行
cat $ExceptionFile|grep -v "^#"|sed /^$/d>$DataException

while read fsdevice fsvalue fsmount
do
# fsvalue=`echo $fsvalue|sed s/\%//g`
#两种方式都可以使用 sed 和匹配法 注意 转义 \%
fsvalue=${fsvalue%\%}
#查找是否存在Exception中,是则比较,将值设置为NowMax
if [ -s $DataException ]
then
while read ExceptionMount NewMax
do
#字符串比较必须加空格 =等于号之间 否则错误
if [[ $fsmount = $ExceptionMount ]]
then
NowMax=${NewMax%\%}
break
fi
done<$DataException
fi
if ((fsvalue>NowMax))
then
echo "$fsdevice $fsvalue $fsmount">>df.out
#NowMax设置回来
NowMax=$FSMAX
fi

done<$WorkFile

#-s 如果文件存在
if [ -s $OutFile ]
then
cat $OutFile
fi


#!/bin/bash
#this file is use to mk a big file
#echo -e "\c" 代表不换行

Line_Length=80
Total_Length=$1
OutFile=./bigfile
Line_Count=0
Char=X

function usage
{
echo "usage error"
}


if (($#!=1))
then
usage
exit 1
fi


if [ -f $OutFile ]
then
rm -f $OutFile
fi

touch $OutFile
while ((Line_Count<Total_Length))
do
Char_Count=0
while((Char_Count<Line_Length))
do
echo -e "${Char}\c">>$OutFile
((Char_Count++))
done
((Line_Count=Line_Count+1))
# echo $Line_Count
echo>>$OutFile
done

#cat $OutFile


#!/bin/bash

#& is back run
#$! is the pid

while true
do
echo -e ".\c"
sleep 3
done&

Old_PID=$!

./mk_bigfile.sh 1500

kill $Old_PID


#!/bin/bash


TCount=0
interval=3
while true
do
((Tcount=Tcount+1))
case $Tcount in
"1") echo -e "-\b\c"
sleep $interval
;;
"2") echo -e '\\'"\b\c"
sleep $interval
;;
"3") echo -e "|\b\c"
sleep $interval
;;
"4") echo -e "/\b\c"
sleep $interval
;;
*) Tcount=0
;;
esac
done&

Old_PID=$!

./mk_bigfile.sh 1000

kill $Old_PID


#!/bin/bash

echo "参数个数"$#
echo $!

echo "状态码:"$?


#!/bin/bash

#cut -d ":" -f 1 /etc/passwd
#cut -c 列出第几个字符
#cut -c 1 /etc/passwd

#od 以八进制显示
#od command.sh

#16进制显示
#od -x command.sh

# cp -p 保存原来的拥有者组和使用权限

#mkdir -p 自动创建其中不存在的目录

#mkdir -m 744 home

#touch file 把文件访问时间设定为现在

#tee 显示管道里面的内容

# -n 只取样1次
# top -n 1 |grep root

# -d delay
#top -d 1

# kill -l 显示所有信号

#nice 数字越小优先级越高 renice
#nice -n -10 vi hello


#!/bin/bash

tail -n +2 sortfile
tail -n -1 sortfile

#翻转
tac sortfile

#翻译
tr a-z A-Z<sortfile
cat sortfile|tr a-z A-Z


#!/bin/bash
#-n 表示每次只接受一个参数
find ../../ -type f |xargs -n 1 grep java

#xargs 可以把文件内部的内容输出来 而不只是输出管道到文件名
#find ./ -name uniqfile |xargs grep java


#!/bin/bash
#删除#开头的行
#sed '/^#/d' sedfile

#sed 's/^#/$/' sedfile
# sed 's/^#/$/g' sedfile


# 替换2个以上空格为一个空格 ,逗号不要忘了 表示2个或者多个
#sed 's/ \{2,\}/ /g' sedfile


#删除有空格的行
#sed '/ /d' sedfile

#将4-6 行的a换成A
#sed '4,6s/a/A/g' sedfile

#去掉空行
#grep -v '^$' sedfile

#计算空行

grep -c '^$' sedfile


#!/bin/bash
#k用于第几个字段排序 t用于一行的分割字符
sort -k 1 -t "," sortfile

echo

echo

sort -k 2 -t "," sortfile

echo
echo

sort sortfile

echo

echo

sort -k 2 sortfile


#!/bin/bash

#uniq -u 只显示不重复的行 -d 只显示重复的
#uniq 只删除相邻行重复的 所以要与sort 一起用

sort uniqfile | uniq

sort uniqfile |uniq -u

sort uniqfile |uniq -d

# -c 计算重复次数
sort uniqfile |uniq -c |sort

sort uniqfile |uniq -c |sort -k 2


grep -v 显示不匹配的
grep -E 扩展 注意E 大写
grep -i 忽略大小写
grep -c 显示匹配的行数
grep -o 只显示匹配的字符串


#!/bin/bash

#" " '' grep

#grep NW datafile
#grep '^n' datafile


# ^ 开头 $ 结尾
#grep '4$' datafile

#注意引号 否则空格会导致 文件分割
#grep "TB Savage" datafile


#\. 转义.
#grep '5\..' datafile

#grep "^[we]" datafile

#打印所有包含非数字的行
#grep '[^0-9]' datafile

#打印包含两个大写字符一个空格加上一个大写字符的
#grep '[A-Z][A-Z] [A-Z]' datafile

#grep 'ss* ' datafile

#打印至少9个小写连续字符的
#grep '[a-z]\{9\}' datafile
#匹配至少5个a \{n\}至少匹配n个字母
#grep 'a\{5\}' datafile

# \< \>界定一个单词的开头或者结尾
#grep '\<north' datafile

#grep '\<north\>' datafile

# \b 也可以界定单词的开头或者结尾
#grep '\bnorth\b' datafile

#grep '\<[a-z].*n' datafile

#
#
#
#grep -E E注意大写
#grep -E 'NW|WE' datafile


# * 0个或者多个 + 1个或者多个 ?0个或者1个 .一个

#匹配一个或者多个3
#grep -E '3+' datafile

#grep -E '2\.?[0-9]' datafile

#()表示一个词组 这里1个或者多个no
#grep -E '(no)+' datafile

#[^0-9]不在0-9之间 -E 不需要 \{\}
#grep -E '\.[0-9]{2}[^0-9]' datafile

#只显示匹配的行数
# grep -c '\bnorth' datafile
#只显示字符串
#grep -o '\bnorth' datafile


#!/bin/bash

grep "file.*" file.*

grep file.* file.*


#!/bin/bash

#找出非空行

#grep '.' grep3file

#找出有连续5个字母的行

#grep '.....' grep3file

#找出含有. 的行

#grep '\.' grep3file

#找出有2个连续数字的行

#grep '[0-9]\{2\}' grep3file

#找出有3-5个数字的单词

#grep '\b[0-9]\{2,5\}\b' grep3file

#与上一个的区别
#grep '[0-9]\{2,5\}' grep3file

#找电话号码格式

grep '[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}' grep3file
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值