当shell script没有执行x权限时,需要使用sh来进行调用
如果拥有该权限可以直接./shell.sh运行
#######################################################
shell script 整体格式
1.
在第一行
#!/bin/bash
必须以该段为开头,来宣告该脚本片段的语法,才能在程序被执行时,加载bash的相关环境配置文件
2.
将填写关于程序内容的相关批注,譬如,内容与功能,版本信息,作者与联系方式,创建日期,历史记录等等
3
环境变量的宣告
当程序进行时,会加载宣告的环境变量里的外部指令,在程序的执行中可以直接使用外部指令,而不用使用绝对路径来调用
4
程序编写部分
5
将结果返回
也就是在程序执行后输入#?显示的结果就是我们编写程序的传回结果
#####################################################
计算公式
val = $((计算内容))
当需要计算小数点的值时可以经过bc的处理显示
echo "3.3 * 5" | bc
######################################
计算 pi 方法
echo "scale=${10}; 4*a(1)"|bc -lq
显示小数点后十位pi
############################################################
当程序直接运行bash程序时,其实是会新建一个子bash程序来执行,所以如果当bash的执行脚本更改了当前的变量,在退出程序后会被还原,如果需要使用脚本内的变量在退出程序时不还原,可以使用
source ./shell.sh
来执行程序
################################################################
test
常用的测试功能,来判断给定条件的结果
-e fileName判断该名字类型的文件是否存在
-f fileName 判断该名字目标是否为文件
-d fileName 判断文件名目标是否为目录
-b fileName 判断文件名是否为一个block device装置
-c fileName 判断是否存在且为character device装置
-S fileName 判断是否存在且为一个Socket文件
-p fileName 该文件是否存在且为一个FIFO文件
-L fileName 该文件是否存在且为一个快捷方式
//////////////////////////////////////////////////////////////////////
文件的权限检测
-r fileName 判断文件是否存在可读权限
-w fileName 判断文件名是否存在可写的权限
-x 判断文件名是否存在可执行的权限
-u 判断该文件名是否存在且具有SUID的属性
-g 判断该文件名是否存在切具有SGID的属性
-k 判断该文件名是否存在且具有Sticky bit 的属性
-s 判断该文件名是否存在且为非空白文件
///////////////////////////////////////////////////////////////////////////
两个文件之间的比较
test file1 -nt file2
-nt newer than 判断file1是否比file2新
-ot older than 判断file1是否比file2旧
-ef 判断 file1 与 file2是否为同一文件,可用在判断hard link的判定上, 主要意义判断是否指向同一个inode
#########################################################
两个整数之间的判定
test n1 -eq n2
-eq 两数值相等 equal
-ne 两数值不等 not equal
-gt n1 大于 n2 greater than
-lt n1小于n2 less than
-ge n1大于等于n2 greater than or equal
-le n1 小于等于 n2 less than or equal
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
字符串数据判断
test -z string 判断字符串是否为空, 为空时返回true
test -n string 判断字符串是否非为空,当字符串非空时返回true(默认)
test str1 == str2 判断str1是否等于str2,若相等,则回传true
test str1 != str2 判断str1是否不等于str2,若相等,则传回false
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
多重条件判定
test -r file1 -a -x file1
-a 为and,且的意思当file1存在可读和可执行权限时,才会回传true
-o 为or, 或的意思,当两个条件满足任意一条时都能成立
! 反相状态, 如 test ! -r file1 当file1不存在读取权限的时候,才返回true
###########################################################
利用判断符号[]
[ "$HOME" == "$MAIL" ]
在判断时,判断的参数的读取将是以空格为边界,所以必须要在两边参数和判断符号前后添加空格
变量最好用双引号包裹
常量最好用单引号包裹
#############################################################
在shell script 里
$0 表示当前文件路径
$1 表示执行该脚本的第一个参数
$2 为第二个参数
$#: 表示接的参数的个数
$@: 表示 "$1","$2"查看当前参数的内容,将用双引号括起来
$* 表示
############################################
shift 1
表示略过参数
如传入参数为 0,1,2,3
$0 为0
shift 1 进行偏移后
$0 为1
#####################
条件判断
if [条件判断]; then
fi
多个条件可以使用&& ||来区分
多重条件判断
if[条件判断];then
elif [条件判断]; then
else
fi
#######################################################
case $变量名称in
条件1)
;;
条件2)
;;
*) 默认执行
;;
esac
#############################################################
函数
function fname(){
}
需要写在执行之前
####################################################
循环
while[条件判断] 当条件成立时,进行循环
do
done
///
until[条件判断] 当条件不成立时,进行循环
do
done
////
for var in con1 con2 con3
do
done
会一次将con1,con2,con3的值赋给var
例如将之前查询结果进行遍历
例如
users = $(cut -d ':' -fl /etc/passwd)
for username in ${users}
do
id ${username}
done
如果想循环一个连续数字
for val in $(seq 1 100)
do
done
类似C语言的for
for((初始;限制条件;步阶))
do
done
####################################################################
debug相关
sh [-nvx] scripts.sh
-n: 查询当前是否存在语法问题
-v: 在执行前,将scprts的内容输出到屏幕上
-x: 将使用到的scrpit内容显示到屏幕上