1.Linux Shell脚本的字符串截取
假设有变量 var=http://www.linuxidc.com/test.htm
一 # 号截取,删除左边字符,保留右边字符。
echo ${var#*//}
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.linuxidc.com/test.htm
二 ## 号截取,删除左边字符,保留右边字符。
echo ${var##*/}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.linuxidc.com/
结果是 test.htm
举例:ACCOUNT=USER10 只想保留10
echo ${ACCOUNT##*[[:alpha:]]} 或者 echo ${ACCOUNT##*[a-z,A-Z]}
10
三 %号截取,删除右边字符,保留左边字符
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.linuxidc.com
四 %% 号截取,删除右边字符,保留左边字符
echo ${var%%/*}
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:
五 从左边第几个字符开始,及字符的个数
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
六 从左边第几个字符开始,一直到结束。
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.linuxidc.com/test.htm
七 从右边第几个字符开始,及字符的个数
echo ${var:0-8:4}
其中的 0-8 表示右边算起第八个字符开始,4 表示字符的个数。
结果是:test
八 从右边第几个字符开始,一直到结束。
echo ${var:0-8}
表示从右边第八个字符开始,一直到结束。
结果是:test.htm
if 表达式;then
语句
fi
vim f1.sh
#!/bin/bash
read -p "please input one user " ACCOUNT
if grep $ACCOUNT /etc/passwd &>/dev/null ;then
echo -e "\033[31m the user $ACCOUNT is exist\033[0m"
fi
&代表所有的输出信息
测试:
[root@mail ~]#bash f1.sh
please input onuser root
the user root is exist
不存在就不输出:
[root@mail ~]#bash f1.sh
please input onuser user100
if 表达式;then
语句
else
语句
fi
#!/bin/bash
read -p "please input on user " ACCOUNT
if grep $ACCOUNT /etc/passwd &>/dev/null ;then
echo -e "\033[31m the user $ACCOUNT is exist\033[0m"
else
echo -e "\033[31m the user $ACCOUNT is not exist\033[0m"
fi
if 表达式1;then
语句1
elif 表达式2; then
语句2
elif 表达式3;then
语句3
。。。
fi
case $变量 in
变量值1)
语句1;;
变量值2)
语句2;;
变量值3)
语句3;;
*)
语句n;;
esac
[root@mail ~]#ll /root/f1.sh
-rw-r--r-- 1root root 227 Jul 6 19:47 /root/f1.sh
[root@mail ~]#STRING=`ll /root/f1.sh`
[root@mail ~]#echo $STRING
-rw-r--r-- 1root root 227 Jul 6 19:47 /root/f1.sh
[root@mail ~]# echo ${STRING:0:1}
-
赋值:
[root@mail ~]#FIRSTCHAR=${STRING:0:1}
[root@mail ~]#echo $FIRSTCHAR
-
[root@mail ~]#ll /root/abc //显示abc下内容
[root@mail ~]# ll -d /root/abc 显示abc目录
drwxr-xr-x. 5root root 4096 Apr 2 15:35 /root/abc
[root@mail ~]#ls -l -d /root/abc
drwxr-xr-x. 5root root 4096 Apr 2 15:35 /root/abc
-l use a long listing format
-d, --directory
list directory entries instead of contents,and do not dereference symbolic links
#!/bin/bash
read -p "please input one dir " DIR
read -p "please input one OBJ " OBJ
if [ -e $DIR/$OBJ ] ; then
STRING=`ls -l-d $DIR/$OBJ`
FIRSTCHAR=${STRING:0:1}
case$FIRSTCHAR in
l)
echo -e"\033[31m the $DIR/$OBJ islink\033[0m"
;;
d)
echo -e"\033[31m the $DIR/$OBJ isdirctory\033[0m"
;;
b)
echo -e"\033[31m the $DIR/$OBJ isblock\033[0m"
;;
c)
echo -e"\033[31m the $DIR/$OBJ ischar\033[0m"
;;
-)
echo -e"\033[31m the $DIR/$OBJ isfile\033[0m"
;;
*)
echo"unknown"
;;
esac
else
echo -e"\033[31m the $DIR/$OBJ is not exist\033[0m"
fi
循环
for 变量 in {变量值};do
循环体
done
for 变量 in $(seq $变量1 $变量2);do
循环体
done
for 变量 in 变量值;do
循环体
done
let expression
$[expression]
$((expression))
+ - * / %
算术运算
let 表达式
$((表达式))
$【表达式】
运算符
+ - * / %
加法
[root@mail ~]#let A=3+5
[root@mail ~]#echo $A
8
余数
[root@mail ~]#let A=10%2
[root@mail ~]#echo $A
0
[root@mail ~]#A=$[5+5]
[root@mail ~]#echo $A
10
[root@mail ~]#A=$((5+5))
[root@mail ~]#echo $A
10
#!/bin/bash
let SUM=0 //定义一个SUM变量,并使其初值为0
for I in {1..100}; do
let SUM=$SUM+$I
done
echo $SUM
结果
[root@mail ~]#bash f1.sh
5050
#!/bin/bash
let SUM=0
for I in $(seq 1 100); do
let SUM=$SUM+$I
done
echo $SUM
#!/bin/bash
let SUM=0
for((I=1;I<=100;I++));
#for I in $(seq 1 100);
do
let SUM=${SUM}+$I
done
echo ${SUM}
while 【判断式】;do
循环体
done
奇数:
[root@mail ~]#vim f3.sh
#!/bin/bash
let SUM=0
let I=0
while [ $I -le 100]; do
if [$[$I%2] -ne 0 ]; then
let SUM=$SUM+$I
fi
let I=$I+1
done
echo $SUM
[root@mail ~]#bash f3.sh
2500
while read 变量;do
循环体
done <文件
[root@mail ~]#echo $SHELL
/bin/bash
[root@mail ~]#echo "$SHELL"
/bin/bash
[root@mail ~]#echo '$SHELL'
$SHELL
``反引号----------〉〉用指令(命令)取代
[root@mail ~]#echo `date`
Mon Jul 703:35:08 CST 2014
#!/bin/bash
while read LINE ; do
ACCOUNT=`echo $LINE |cut -f1 -d:`
ACCOUNTID=`echo $LINE |cut -f3 -d:`
if [ $ACCOUNTID -ge 500 ]; then
echo -e"the $ACCOUNT is \033[31mnormal\033[0m"
else
echo -e "the $ACCOUNT is \033[31msystem\033[0m"
fi
done </etc/passwd
功能代码块
现定义 后引用
返回 return
function 名称()
{
代码块
}
函数名称
名称()
{
代码块
}
函数名称
实例1. 找出1个目录下大于1k的文件,转移到另一个目录
方法一:
#!/bin/bash
find /home/user1/test1 -type f -size +1k | while read file
do
mv $file /home/user1/test2
done
方法二:
#!/bin/bash
for I in `find /home/user1/test -type f -size +1k`;
do
mv $I /home/user1/test2
done
方法三:
#!/bin/bash
find /home/user1/test1 -type f -size +1k >/home/user1/test.txt
do
mv $I /home/user1/test2
done
使用IFS读文件
说明:默认情况下IFS是空格,如果需要使用其它的需要重新赋值
#!/bin/bash
IFS=:
while read field1 field2
do
echo $field1$field2
done < a.txt