# shell脚本开头
#!/bin/bash
使用
$n
变量得到执行脚本时输入的第n个参数使用
$#
变量拿到执行脚本时输入的参数个数使用
$*
或$@
获取执行脚本输入的所有参数(其中$*
将所有参数当做一个整体)使用
$?
查看最后一条命令的执行情况,返回0表示上条命令正确执行;如果该变量的值非0,则证明上条命令执行不正确使用
$(())
或者$[]
运算符进行参数之间的运算-
条件判断:
[ condition ]
或者test condition
,[]
中条件非空即为true
,例如:[ all ]
为true
,[ ]
为false
--常见的判断条件--
两个整数之间的判断:等于(-eq)、不等于(-ne)、大于(-gt)、小于(-lt)、大于等于(-le)、小于等于(-ge)
按照文件权限进行判断:是否具有可读权限(-r)、是否具有可写权限(-w)、是否具有可执行权限(-x)
按照文件属性进行判断:是否为文件(-f)、是否为目录(-d)、是否存在(-e)
-
单分支流程控制
# 语法 if [ conditon ]; then structure fi # 或者 if [ conditon ] then structure fi # 举例 if [ $1 -gt 18 ] && [ $1 -lt 35 ]; then echo ok fi # 或者以下方式,其中-a表示and,-o表示or if [ $1 -gt 18 -a $1 -lt 35 ]; then echo ok fi
-
多分支流程控制
- if-else方式
if [ condition ] then structure elif [ condition] then structure else structure fi
- switch-case方式
case $variety in "value") structure ;; "value") structure ;; "value") structure ;; *) structure ;; esac
- for循环方式
for((初始值;循环控制条件;变量变化)) do structure done
下面给出示例(递归求和):
#!/bin/bash # 使用for循环进行求和 sum=0 for((i=0;i<=$1;i++)) do sum=$[$sum + $i] done echo $sum # 使用while方式进行求和 a=1 while[ $a -le $1 ] do sum2=[$sum2 + $a] a=$[$a + 1] #或者let sum2+=a #或者let a+=1 done echo $sum2
for os in Linux Windows macOS; do echo $os; done
下面的
{1..n}
表示一个序列for i in {1..100}; do sum=$[$sum+$i]; done; echo $sum
$*
和$@
没有被引号引起来的时候作用完全一样;在两者被引号引起来的时候(在for循环中),$*
会将所有变量当做1个变量输出,而$@
会逐一输出所有的变量- 读取控制台输入
read
[-p] : 控制台提示内容
[-t] :控制台持续时间
#!/bin/bash read -t 10 -p "please input your name:" name echo "welcome, $name!"
- 系统函数
在脚本编写过程中如果需要调用系统函数则需要使用
$()
进行命令替换basename
: 用来获取文件名称,可以添加[suffix]参数来将文件名中的后缀名称去掉# 获取某文件的文件名称 basename /home/test.sh .sh
dirname
: 获取文件所在的目录(针对当前输入来输出文件所在的路径,输出会将输入的最后一个/
去掉)#!/bin/bash # 输出当前文件所在的绝对路径 echo path=$(cd $(dirname $0); pwd)
-
自定义函数
语法:[function] funname[()]
{
Action;
[return int;]
}
注:function返回值范围只能在0~255之间