shell脚本基础语法

发布时间:2020/12/04 作者:天马行空 阅读(1131)

shell基础语法

#!/bin/bash
echo "Hello, world!"

上面中的 #! 是一种约定标记, 它可以告诉系统这个脚本需要什么样的解释器来执行;


变量

#变量赋值
bianliang="aaa"

#删除变量
unset bianliang

#输出变量
echo ${bianliang}

#如果变量存在则返回word
echo ${bianliang:+word}

#变量不存在返回word,但不改变bianliang的值
echo ${bianliang:-word}
#变量不存在返回word,并给bianliang赋值
echo ${bianliang:=word}

#echo $bianliang


参数

#输出当前脚本的文件名
echo $0
#输出脚本传递的第一个参数
echo $1
#输出脚本传递参数的个数
echo $#
#脚本传递的所有参数
echo $*
echo $@
#当前脚本的进程ID
echo $$


上一条命令返回的退出状态,执行成功返回0,失败返回1

echo $?


获得一个命令执行后的返回值

#它的意思就是说我们把一个命令的输出赋值给一个变量,方法为把命令用反引号(在Esc下方)引起来
directory=`ls`
echo $directory



Shell运算符

条件测试语句可以分为 4 种:
1、文件测试语句;
2、逻辑测试语句;
3、整数值比较语句;
4、字符串比较语句。


文件测试运算符

-d测试文件是否为目录类型 目录返回0
-e测试文件是否存在
-f判断是否为一般文件
-r测试当前用户是否有权限读取
-w测试当前用户是否有权限写入
-x测试当前用户是否有权限执行



逻辑运算符

&&“与”,都满足
||“或”,其中一个满足
“非”,取相反值判断



整数比较运算符

-eq是否等于
-ne是否不等于
-gt是否大于
-lt是否小于
-le是否等于或小于
-ge是否大于或等于


字符串比较运算符

=比较字符串内容是否相同
!=比较字符串内容是否不同
-z判断字符串内容是否为空


#注意运算符两边一定要要空格,不然就是在拼接字符串,不会执行运算
a=2
b=9
#加
echo `expr $a + $b`
echo $[$a+$b]
#减
echo `expr $a - $b`
echo $[$a-b]
#乘
echo `expr $a \* $b`
echo $[$a*$b]

#关系运算符
[ $a -eq $b ] #相等
[ $a -ne $b ] #不相等
[ $a -gt $b ] #>
[ $a -ge $b ] #>=
[ $a -lt $b ] #<
[ $a -le $b ] #<=

#字符串运算符
[ $a = $b ] #相等
[ $a != $b ] #不相等
[ -z $a ] #字符串长度为0,返回true
[ -n $a ] #长度不为0返回true
[ $a ] 不为空返回true

#文件测试运算符
file=/home/wwwroot/www/shellstudy.sh
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi


字符串

#拼接字符串
a='abcde';
echo "aaaa${a}aaaaaa"
#获取字符串长度
echo ${#a}
#截取字符串
echo ${a:0:2}
#查找字符串
echo `expr index $a cde`


数组

a=(1 2 3 4 5)
a[0]=1
a[1]=2
a[2]=3
a[3]=4
#读取下标为2的值
echo ${a[2]}
#读取数组的全部元素
echo ${a[*]}
#获取数组的长度
length=${#a[*]}
echo $length
#获取数组全部下标
xb=${!a[*]}
echo $xb


流程控制语句

#if语句,注意条件表达式两边应该都有一个空格
a=2
b=3
if [ $a -eq $b ]
then
    echo "==="
else
    echo "!="
fi

if [ $a -eq $b ]
then
    echo "相等"
elif [ $a -gt $b ]
then
    echo "$a>$b"
elif [ $a -lt $b ]
then
    echo "$a<$b"
fi
#for循环
arr=(1 2 3 4)
for i in ${arr[*]}
do
   echo "${i}"
done

for((i=1;i<=5;i++));do
    echo "这是第 $i 次调用";
done;

while
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done

#until循环
a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done
#case命令
a=1
read a
case ${a} in
1) echo 'aaaaa'
;;
2) echo 'bbbbb'
;;
3) echo 'ccccc'
;;
*) echo 'error'
;;
esac
#死循环 break
while true
do
   read a
   case ${a} in
   1|2|3|4) echo "你输入了${a}"
   ;;
   *) echo "你要输入1-4之间的数字"
      break
   ;;
   esac
done

#死循环 continue
while true
do
   read a  
   case ${a} in 
   1|2|3|4) echo "你输入了${a}" 
   ;;
   *) echo "你要输入1-4之间的数字" 
      continue
   ;;
   esac
done


shell函数

#定义
function testF(){    
    echo "hell world $1 $2"
}

#调用函数
testF a b

#删除函数
unset .f testF


注意:

1、 调用函数只需要给出函数名,不需要加括号。
2、函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。
3、Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。
4、函数的参数可以通过 $n  得到。


实例:获得当前系统中还可以使用的内存大小,单位M

[root@netljc ~]# mem=`free -m | grep 'Mem' | awk '{print $4}'`
[root@netljc ~]# echo $mem

先使用 free -m 命令查看内存使用量情况(单位为 MB),然后通过 grep Mem:命令过滤出剩余内存量的行,再用 awk '{print $4}'命令只保留第四列,最后用 mem=`语句`的方式把语句内执行的结果赋值给变量

关键字linux shell