shell 脚本编程快速入门

变量

特殊变量


echo "id:$$"            #当前进程id
echo "script name $0"   #当前脚本名
echo "parm length $#"   #参数数量
echo "parm[1]=:$1"      #第1个参数
echo "all parm $*"      #所有参数
echo "all parms $@"     #所有参数
echo $?                 #上一个命令的退出状态

echo $*
echo $@

变量


#变量名和等号间不能有空格
valX=1
echo "$valX"

#变量重新赋值
valX=2
echo $valX

#帮助识别边界,推荐给所有变量添加花括号
valX="3"
echo ${valX}


varR=1
#只读变量,不能再赋值
readonly varR

#删除变量,但是不能删除只读变量
unset valX


#保存命令的输出结果,适当地方输出,注意这里是反引号
DATE=`date`
echo $DATE

变量替换

num="num"
echo ${num}   #变量本来的值
echo ${num:+"yes"} #如果变量已经定义,返回后面值,不修改变量
unset num
echo ${num:-"null"} #如果为空或已删除,返回后面的值,但是不改变变量
# echo ${num:?"error"} 如果为空或已删除,将后面的值作为标准错误输出,会终止程序
echo ${num:="ok"}   #如果为空或已删除,返回后面的值,并修改



echo "val \n val"
#对转义字符进行替换,否则原样输出
echo -e "val \n val"

输入

#echo "hello,please input your number:"
# read  parY
# echo "hello ,$parY"

shell运算符

# 原生bash 不支持简单的数学运算,但是可以通过其它命令实现,比如awk,expr

#表达式,运算符之间必须要有空格
ans=`expr 2 + 3` 
echo $ans
echo `expr 2 - 3`
echo `expr 2 / 3`
echo `expr 2 \* 3`
echo `expr 2 % 3`

expr 算术运算符

运算符说明
+加法
减法
*乘法
/除法
%取余
=赋值
==相等.用于比较两个数字,相同则返回 true。
!=不相等,用于比较两个数字,不相同则返回 true。

关系运算

a=1
b=2
if [ $a -gt $b ]
then
   echo "$a > $b "
else
   echo "$a <= $b"
fi
运算符说明
-eq检测两个数是否相等,相等返回 true。
-ne检测两个数是否相等,不相等返回 true。[
-gt检测左边的数是否大于右边的,如果是,则返回 true。
-lt检测左边的数是否小于右边的,如果是,则返回 true。
-ge检测左边的数是否大等于右边的,如果是,则返回 true。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。

布尔运算符

运算符说明
!非运算,表达式为 true 则返回 false,否则返回 true.
-o或运算,有一个表达式为 true 则返回 true。
-a与运算,两个表达式都为 true 才返回 true。

文件检测运算符

pat=""

if [ $# -gt 0 ]
    then
        pat=$1
    else
        echo "please input file path:"
        read pat
fi

if [ -e $pat ]
    then
        echo '$pat exists'
    else
        echo "$pat not exists"
        exit
fi
运算符说明
-b file检测文件是否是块设备文件,如果是,则返回 true。
-c file检测文件是否是字符设备文件,如果是,则返回 true。
-d file检测文件是否是目录,如果是,则返回 true。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file检测文件是否是具名管道,如果是,则返回 true。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file检测文件是否可读,如果是,则返回 true。
-w file检测文件是否可写,如果是,则返回 true。
-x file检测文件是否可执行,如果是,则返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。

数组

# 定义数组
arr=(1 2 3)
array=(
    "c"
    "c++"
    "python"
    "c#"
)

#单独赋值
array[4]="java"
array[7]="shell"

# 访问元素
echo ${array[7]}
# 所有值
echo ${array[*]}
echo ${array[@]}

# 数组元素个数
length=${#array[*]}
size=${#array[@]}
echo $length ,$size

# 单个元素长度
echo ${#array[7]}


echo语句

x=1
# 显示字符串
echo "hello "
# 显示变量
echo $x
# 与其它值连接需要用括号
echo "${x}+1="
# 转义字符,换行再换行
echo "ok\n"
# 显示不换行
echo "ko\c"
# 显示重定向
# echo "world" > mFile
echo '$x\c\t\n'
# 显示命令执行结果
echo `date`

printf 语句

  • 默认不换行
  • printf 不加括号
  • format-string 可以没有引号,但是最好加上,双引号单引号都一样
  • 参数多于格式控制符时,format-string可以复用
  • arguments 使用空格分隔,不用逗号
# 双引号
printf "%d %s\n" 1 "hello"
# 单引号
printf '%d %s\n' 2 "world"
# 省略引号
printf %s\n abcde
# format-string 复用
printf "%s\n" "hello" "world"
printf "%s %s %s\n" a b c d e f g

printf "Time:%s\n" `date`


if 语句


x=1
y=2
if [ $x -gt $y ]
then
    printf "%d > %d \n" $x $y
else
    printf "%d <= %d\n" $x $y
fi

if [ $# -eq 0 ]
then
    echo "arg num = 0"
fi


if [ 2 == 1 ]
then
    echo "2 = 1"
elif [ 2 -gt 1 ]
then
    echo "2 > 1"
elif [ 2 -lt 1 ]
then
    echo "2 < 1"
else
    echo "error"
fi

if [ 2 -gt 1  ] ; then echo "2 >=1" ; else echo "2<1";fi;

if test 2 -gt 1
then echo "yes"
else
    echo "no"
fi

case 语句

  • 取值后面必须为关键字in
  • 每个模式以右括号结束
  • 匹配取值后执行命令直到遇到 ;;
  • 每个模式都要有 ;;
num
echo "please input n num:"
read num
case $num in
    1)
        echo "select 1"
        echo "good choose"
    ;;
    2)
        echo "select 2"
    ;;
    3)
        echo "select  3"
    ;;
    *)
        echo "you do not select 1-3"
    ;;
esac

option=${1}
case $option in
    -f)
        FILE=${2}
        echo "file name is $FILE"
    ;;
    -d)
        DIR=${2}
        echo "dir name is $DIR"
    ;;
    *)
        echo "correct useage : [-f file] | [-d dir]"
        exit
    ;;
esac

echo "input your num:"
read num
case $num in
    1|2|3)
        echo " 1 or 2 or 3"
    ;;
    4)
        echo "4"
    ;;
    *)
        echo "error"
    ;;
esac

for循环

for i in 1 2 3
do
    echo $i
done


## 遍历当前目录下所有shell脚本文件
for i in ./*.sh
do
    echo $i
done

while 循环

条件满足才执行

count=0
while [ $count -lt 5 ]
do
    count=`expr $count + 1`
    echo $count
done


echo "type ctrl + d to end"
echo "enter your msg :"
while read FILE
do
    echo "input msg $FILE"
done

until 循环

条件满足就结束


a=0
until [ $a -gt 5 ]
do
    echo $a
    a=`expr $a + 1`
done

break 与 continue

echo "input num until num <= 0"
while :
do
    read num
    if [ $num -gt 0 ]
    then
        echo "$num > 0"
    else
        break
    fi
done
echo "exit input"

# break 1 跳出最里面一层循环 2,3...类似
# break 跳出当前的所有循环(最里层
for i in 1 2 3
do
    for j in 4 5 6
    do
        if [ $i -eq 1 -a  $j -eq 4 ]
        then
            break
        else
            echo "break $i $j"
        fi
    done
done
# continue n 跳过本次循环,从里到外第n层
# continue 跳过本次循环(最里层

for i in 1 2 3
do
    for j in 4 5 6
    do
        if [ $i -eq 1 -a  $j -eq 4 ]
        then
            continue 2
        else
            echo "continue $i $j"
        fi
    done
done

函数

# 定义函数
function hello(){
    echo "hello world"
}

# 可以不用 function 关键字
say(){
    echo "yes"
}

# 函数调用不需要括号
say
hello

add(){
    echo "please input a:"
    read a
    echo "please input b:"
    read b
    return `expr $a + $b`
}
add
# 函数只能返回整数值,一般用于判断函数是否执行成功
# 再调用函数的语句后面紧跟着 用 $? 获取返回值
ret=$?
echo "sum :$ret"

# 删除函数
unset -f add

函数参数

function print(){
    echo "parameter 1 :[ $1 ]"
    echo "parameter 2 :[ ${2} ]"
  # 参数位置大于9 不能通过 $10 的形式
    echo "parameter 10 : [ ${10} ]"
  # 参数个数
    echo "parameter num : $# "
  # 所有参数
    echo "all parameter : $* "
}

print 1 2 3

包含文件

e1.sh

echo "i am e1"

function print(){

    echo "print"
}

main.sh

# 包含文件,被包含的文件不一定要有执行权限
source ./e1.sh
# 也可以
# . ./e1.sh
print

    原文作者:WarpTens
    原文地址: https://www.jianshu.com/p/b35d60cc18c6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞