您的位置:首页 > 运维架构 > Shell

shell语法快速入门(1)

2016-11-29 14:20 525 查看
#得到绝对路径
DIR=$(cd `dirname $0`;pwd)
$DIR/file.txt

#去掉#注释

egrep -v "(#|^$)" /etc/zabbix/zabbix_server.conf

基本语法:

export 变量=变量值 声明全局变量

unset $变量名 清空变量

read -p "真的卸载?(yes|no)" flag

使用 read [-p "提示信息" ] 变量名 声明交互变量

常见环境变量$USER $LOGNAME $UID $SHELL $HOME $PWD $PATH $PS1 $PS2

$n (n在1-9之间)位置变量

预定义变量:

$#传递到当前脚本的参数的总个数,
$*以一个单字符串显示所有向脚本传递的参数,
$?上一条指令执行后返回的状态,
$$当前所在进程的进程号,$!后台运行的最后一个进程,
$0当前执行的进程程序名

条件判定:

&&成功执行一个命令,再执行下一个命令 modprobe ppp-compress-18 && echo success
||一个命令执行失败后再执行下一个命令
()在一个子shell里执行的一组命令 {}在当前shell里执行一组命令,修改变量值立即起效

多种括号的使用

(( ))多用于计算表达式 [[ ]] 语法最兼容,逻辑判断 () 优先级最高 [ ] 逻辑判断,兼容性不高

运算 加`expr $1 + 2` 减 `expr $1 -2 ` 除`expr $1 / 2`

常用文件判定
-e文件存在 -f 文件是个普通文件 -s 文件大小不为零
-d 文件是一个目录 -b 文件是一个块设备 -c 文件是一个字符设备
-p 文件是一个管道 -h|-L 文件是一个符号链接 -s 文件是一个socket
-t 文件与一个终端设备相关 -r 文件是否可读 -w 文件是否可写 -x 文件是否可执行
f1 -nt f2 文件f1比f2新 f1 -ot f2 文件f1比f2旧 f1 –ef f2 文件f1与f2是相同文件的硬链接

字符串判定

-z 字符串为null -n 字符串不为null

数值判定

-eq 等于 –ne不等于 –gt大于
–ge大于等于 –lt 小于 –le 小于等于

常用判定符

= != 可在[ ]中使用
< <= >= > 可在双括号内 [[ ]] 使用

逻辑判定

-a 逻辑与 -o 逻辑或

条件判断if
if [ $# = 0 ] ;then // [ = ]间有空格, then前有;号
...
elif [ $a -lt 3 ];then
...
fi
多条件判断
if [ -n $port1 ] && [ -n $port2 ] && [ -n $port3 ] && [ -n $port4 ] && [ -n $port5 ];then
if [ -n $port1 ] || [ -n $port2 ] || [ -n $port3 ] || [ -n $port4 ] || [ -n $port5 ];then
注意:如果if 的条件中包含字符串变量变量,请注意使用“”,如:if [ -z "$test" ];then

条件判断case
case $letter in
U|u) whoami ; ;
L|l) ls –l / ; ;
E|e)exit ;;
*) echo “please input true parm!!!” ; ;
esac

for 循环
(使用return 0或1来退出循环)
格式1:
int j=0
for i in $arr //$arr为链表
do
echo "第$j次循环"
j=`expr $j + 1`
done
格式2:
for (( i = 0; i < $len ; i++ )) ; do
echo "第$i次循环"
done

while循环
(使用return 0或1来退出循环)
格式:
While [ $num –lt 10 ]
Do
Done

sample1:
while [ $# -ne 2 ]
do
echo "输出$#"
sleep 1 //休息1s
if [ $i -eq 100 ]
then
break //退出
fi
shift
done

until循环
(使用return 0或1来退出循环)
Util [ $num –lt 10 ]
Do
Done

数组
声明
array[key]=value #array[0]=one,array[1]=two
declare -a array #array被当作数组名
array=( value1 value2 value3 ... )
array=( [1]=one [2]=two [3]=three )
array="one two three" # echo ${array[0|@|*]} 把array变量当作数组来处理,但数组元素只有字符串元素本身
访问
${array[key]} #${array[1]}
${array[@|*]} #输出所有元素
${array[@]:1} #从第二(1+1)个元素开始,后面所有的元素
${array[@]:0:2} #从第一(0+1)个元素开始的两个元素
${array[@]:1:3} #从第二个元素开始的三个元素
${#array} #计算数组第一个元素的长度
${#array[0]} #同上
${#array[*}} #计算数组的个数
${#array[@]} #同上
删除
unset array[1] #删除数组中的第一个元素
unset array #删除整个数组
${array[@]#t*e} #删除字符串左边开始最短的匹配t*e
${array[@]##t*e} #删除字符串左边开始最长的匹配t*e
${array[@]%o} #删除字符串右边开始最短的匹配
${array[@]%%o} #删除字符串右边开始最长的匹配
字串替换
${array[@] /o/m} #数组中所有的o都会被替换为m
${array[@] /o/} #所有匹配到的o都会被删除
${array[@] /#o/m} #数组已o开头的匹配将会被替换
${array[@] /%o/m} #数组已o结尾的匹配将会被替换
sample排序
bak_date_ns=(`cat $tmpfile1|awk -F "." '{print $1}'`) //排序前
bak_date=($(for val in "${bak_date_ns[@]}" //排序后
do
echo "$val"
done|sort)
)

函数

使用函数的好处:可以将一组功能打包,在同一shell中,多次调用。
函数的声明
function chk_clientip() #检验client_ip参数
{
if_net_well=0
cle_ip=$1
client_ip=$2
server_ip=$3
if [ -n "$cle_ip" ] && [ -n "$client_ip" ] && [ -n "$server_ip" ];then
if_net_well=1
fi
return $if_net_well
}
函数的调用
chk_clientip $cle_ip $client_ip $server_ip
result=$? //函数执行结果,返回的$if_net_well 的值

正则表达式:

ip地址 [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: