shell编程语法入门

108 阅读2分钟

shell概念

shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核。shell还是一个功能强大的编程语言,易编写、易调试、灵活性强。

image-20220724153727413的副本.png

子shell中设置的当前变量,父shell是不可见的。

变量

1.系统预定义变量

    $HOME $PWD $SHELL $USER;echo $HOME;set查看当前shell中的变量;env查看系统环境变量

2.自定义变量

定义变量:变量名=变量值,注意=前后不能有空格

撤销变量:unset 变量名

声明静态变量:readonly 变量,注意:不能unset

export 变量名:提升(父shell)中的变量为全局变量

3.特殊变量

nn为数字,n:n为数字,0代表该脚本名称,11-9代表第一到第九个参数,十以上的参数需用大括号包含如,${10}

$#:获取输入参数的个数,常常用于循环,判断参数的个数是否正确以及加强脚本的健壮性

$*:代表命令行中所有的参数,把所有参数看成一个整体

$@:代表命令行中所有的参数,把每个参数区分对待

$?:最后一次执行命令的返回状态。如果这个变量为0,证明上一 个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明 上一个命令执行不正确了。

运算符

((运算式))或者((运算式))或者[运算式]

条件判断

test condition

[ condition ](注意 condition 前后要有空格)

注意:条件非空即为 true,[ mld ]返回 true,[ ] 返回 false。

(1)两个整数之间比较

-eq 等于(equal)

-ne 不等于(not equal)

-lt 小于(less than)

-le 小于等于(less equal)

-gt 大于(greater than)

-ge 大于等于(greater equal)

注:如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。

eg:[ 2 -eq 2]

(2)按照文件权限进行判断

-r 有读的权限(read)

-w 有写的权限(write)

-x 有执行的权限(execute)

eg: [ -r hello.sh ]

(3)按照文件类型进行判断

-e 文件存在(existence)

-f 文件存在并且是一个常规的文件(file)

-d 文件存在并且是一个目录(directory)

eg:[-e hello.sh]

eg: [ agt18aa -gt 18 -a a -lt 35 ]等价于 [ a -gt 18 ]&&[ a -lt 35 ]

流程控制

1.if判断

if [ 条件表达式 ];then
  程序
fiif [ 条件表达式 ]
then
  程序
fiif [ 条件表达式 ]
then
  程序
elif [ 条件表达式 ]
then
  程序 
else
  程序
fi

2.case语句

case $变量名 in 
"值 1")
  如果变量的值等于值 1,则执行程序 1 
;;
"值 2")
  如果变量的值等于值 2,则执行程序 2 
;; 
  …省略其他分支… 
*)
  如果变量的值都不是以上的值,则执行此程序 
;;
esac

3.for循环

for (( 初始值;循环控制条件;变量变化 )) 
do 
  程序 
donefor 变量 in 值 1 值 2 值 3… 
do 
  程序 
done

4.while循环

while [ 条件判断式 ] 
do 
  程序 
done

读取控制台输入

read (选项) (参数)

①选项:

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待

②参数

变量:指定读取值的变量名

函数

1.系统函数

basename:basename [string / pathname] [suffix] (功能描述:basename 命令会删掉所有的前 缀包括最后一个(‘/’)字符,然后将字符串显示出来。 basename 可以理解为取路径里的文件名称 。选项: suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。

basename /root/scripts/
scripts
basename /root/scripts/ s
script

surname:dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名 (非目录的部分),然后返回剩下的路径(目录的部分)) dirname 可以理解为取文件路径的绝对路径名称

dirname /home/scripts/banzhang.txt 
/home/scripts

命令替换 eg $( pwd )获取命令执行后的值

2.自定义函数

[ function ] funname[()] 
{
    Action;
    [return int;] 
}
​
#!/bin/bash
function add(){
        res=$[$1+$2]
        echo $res;
        return $res;
}
​
read -p "1" a
read -p "2" b
​
add $a $b

必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一 样先编译。

函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将 以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)

综合案例

#!/bin/bash#首先判断输入参数个数是否1
if [ $# -ne 1 ]
then
        echo "参数错误"
        exit
fi#获取当前目录名称
if [ -d $1 ]
then
        echo
else
        echo
        echo "目录不存在"
        echo
        exit
fi
​
DIR_NAME=$( basename $1)
DIR_PATH=$( cd $(dirname $1);pwd )
​
DATE=$( date +%y%m%d)
​
FILE=archive_${DIR_NAME}_${DATE}.tar.gz
DEST=/root/archive/$FILEecho "归档"
​
tar -czf $DEST $DIR_PATH/$DIR_NAMEif [ $? -eq 0 ]
then
        echo
        echo "归档成功"
        echo "归档文件为:" $DIR_PATH/$DIR_NAME
        echo "归档地址为:" $DEST
else
        echo "error"
fi
exit
​
​
#每天凌晨两点定时调用这个shell脚本
0 2 * * * /root/scripts/daily_archive.sh /root/scripts