linux备忘录-shell脚本
知识
shell执行方式
shell执行方式有
通过source或.
在现在的bash环境中执行脚本
变量等会保持通过bash shell.sh或sh shell.sh
使用一个新的bash环境执行脚本
当子程序完成后,在子程序内的各项变量或动作将会结束而不会回传到父程序中通过./shell.sh
只用一个新的bash环境执行脚本
当子程序完成后,在子程序内的各项变量或动作将会结束而不会回传到父程序中
数值运算
$((计算式))可以进行数值运算
total=$(($number1*$number2))
条件判断
test
test -e file 检测file是否存在
test -f file 检测file是否存在且为普通文件f
test -d file 检测file是否存在且为目录d
test -b file 检测file是否存在且为块设备b
test -c file 检测file是否存在且为字符设备c
test -S file 检测file是否存在且为Socket文件s
test -p file 检测file是否存在且为pipeline管道设备p
test -L file 检测file是否存在且为连结档l
档案的权限检测
test -r file 检测file是否存在且有r权限
test -w file 检测file是否存在且有w权限
test -x file 检测file是否存在且有x权限
test -u file 检测file是否存在且有SUID权限
test -g file 检测file是否存在且有SGID权限
test -k file 检测file是否存在且有SBIT权限
test -s file 检测file是否存在且为非空白文档
两个档案之间的比较
test file1 -nt file2 检测file1是否比file2新
test file1 -ot file2 检测file1是否比file2旧
test file1 -ef file2 检测file1和file2是否指向同一inode
两个整数之间判定
test n1 -eq n2 检测n1和n2是否相等
test n1 -ne n2 检测n1和n2是否不等
test n1 -gt n2 检测n1是否大于n2
test n1 -lt n2 检测n1是否小于n2
test n1 -ge n2 检测n1是否大于等于n2
test n1 -le n2 检测n1是否小于等于n2
判定字符串
test -z str 检测str是否为空
test -n str 检测str是否非空
test str1 = str2 检测str1和str2是否相同
test str1 != str2 检测str1和str2是否不同
多重条件判断
test xxx1 -a xxx2 逻辑xxx1和xxx2的与
test xxx1 -o xxx2 逻辑xxx1和xxx2的或
test ! xxx 逻辑xxx的反
例子
echo -e "Please input a filename, I will check the file's type and permission.\n\n"
read -p "Input a filename" filename
test -z $filename && echo "You must input a filename" && exit 0
test ! -e $filename && echo "The file${filename} does not exits" && exit 0
test -f $filename && filetype="regular file"
test -d $filename && filetype="${filetype} directory"
test -r $filename && perm="readable"
test -w $filename && perm="${perm} writable"
test -x $filename && perm="${perm} executable"
echo "The filename: ${filename} is a ${filetype}"
echo "And the permissions are: ${perm}"利用判断符号 []
[** 和 **] 两端需要有空格,用来区分bash中的中括号
使用[],最好注意
-- 中括号[]内的每个组件都需要空格来分隔
-- 中括号[]中的变量,最好用双引号" "括起来
-- 中括号中的常数,最好都以单或双引号括起来
用法
[ -z $varname ] -> 判断字符串是否为空
[ $varname1 == $varname2 ] -> 判断varname1是否等于varname2
例子
read -p "Please input (Y/N):" yn
[ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK, continue" && exit 0
[ "$yn" == "n" -o "$yn" == "N" ] && echo "Oh, interrupt" && exit 0
echo "I do not know what your choice is" && exit 0
$号表达式 用法
- ${} 取出变量的值,同时也可以对变量的值作一定的处理
- $() 先执行括号内的指定,得到指定通过stdout输出的内容
- $(()) 进行算数运算,获得算数运算的结果。
shell 参数与变量
shell参数
- $0 -> 代表指令本身
- $1 -> 代表第一个参数
- $2 -> 代表第二个参数
- $3 -> 代表第三个参数
shell特殊变量
- $# -> 代表后接的参数个数
- $@ -> 代表"$1" "$2" "$3" "$4"..
- $* -> 代表 $1c$2c$3c$4..
参数号码偏移
shift -> 代表左移,代表在左边拿掉几个参数
shift n -> 左移几位,在左边拿掉几个参数
shell结构
条件判断语句
-- 第一种方式 --
if[ 条件判断式 ]; then
当条件成立时执行的指令
fi
可以用[ "$yn" == "Y" ] || [ "$yn" == "y" ] 代替 [ "$yn" == "Y" -o "$yn" == "y" ]-- 第二种方式 --
if[ 条件判断式 ]; then
当条件成立时执行的指令
else
当条件不成立时执行的指令
fi-- 第三种方式 --
if [ 条件判断式1 ]; then
当条件1成立时执行的指令
elif [ 条件判断式2 ]; then
当条件2成立时执行的指令
elif [ 条件判断式3 ]; then
当条件3成立时执行的指令
else
当所有条件不成立时执行的指令
fi
case语句
case $变量名称 in
"第一个比对值")
符合第一个比对值的执行命令。
;;
"第二个比对值")
符合第二个比对值的执行命令。
;;
"第三个比对值")
符合第三个比对值的执行命令。
;;
*)
exit 1
esac
函数function功能
function 函数名称(){
}
-- 函数写在最前面
-- 函数內建变量
---- $0代表函数名
---- $1代表第一个变量等等
循环
---- 第一种 while do done ----
while [ condition ]
do
while内的执行指令
done---- 第二种 until do done ----
until [ condition ]
do
until内的执行指令
done
--这种循环方式与while相反,当条件满足时就结束---- 第三种 for do done ----
for var in con1 con2 con3...
do
for内的执行命令
done
-- var不用加$号---- 另一种for ----
for(( 初始值;限制值;执行步阶))
do
for内的执行指令
done
-- 例如 for(( i=1;i<100;i++ ))
shell的 debug
sh [-nvx] script.sh
-n 不执行script,只查询语法问题
-v 执行script前先输出script的内容
-x 将运行过的script内容输出到屏幕
散乱知识
/etc/init.d 中的脚本是linux服务启动的接口
/etc/init.d/syslogd restart 重新启动系统注册表档
/etc/rc.d/rc.local 开机加载程序项目的数据
shell脚本
- 从上到下,从左往右分析执行
- 空格和tab都会被忽略
- 按下Enter(CR)就会开始执行该命令
- 通过反斜杠\可以跳脱Enter,进行换行书写
#号进行批注
- shell脚本文件执行必须具备rx权限
- 可通过绝对路径/bin/script.sh和相对路径的方式执行
可以通过PATH路径搜寻到而执行
可以通过bash程序来执行 bash shell.sh 或 sh shell.sh
通过第一行的 #!/bin/bash 宣告这个脚本使用的shell名称
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
通过exit 0 回传0值给系统。
命令
echo (在屏幕输出)
echo -e 对转移字符进行解析
echo -n 不换行,在同一行显示netstat (查询目前主机开启的网络服务端口)
netstat -tuln 查看目前主机启动的服务
-- Local Address字段 --
---- IP:port
---- 127.0.0.1代表针对本机开放
---- 0.0.0.0或:::代表对整个Internet开放
---- 80端口 -> WWW
---- 22端口 -> ssh
---- 21端口 -> ftp
---- 25端口 -> mail
---- 111端口 -> RPC (远程过程调用)
---- 631端口 -> CUPS (打印服务功能)id (查看用户的uid gid等)
id username
finger (查看用户的特殊参数)
finger username
- ping (网络侦测)
seq (用于产生序列)
seq 1 100 产生1 2 .. 100的序列,可用于for循环
whoami (查看自己的用户名)
参考
鸟哥的Linux私房菜 第三版
linux备忘录-shell脚本的更多相关文章
- 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器
本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...
- 使用C#给Linux写Shell脚本(下篇)
在上篇的<使用C#给Linux写Shell脚本>结尾中,我们留下了一个关于C#如何调用BashShell的问题.在文章发布之后,我留意到有读者留言推荐使用“Pash”(一款类PowerSh ...
- Linux/Unix shell 脚本中调用SQL,RMAN脚本
Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可 ...
- Linux常用Shell脚本珍藏【转载】
我们在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运维常用的脚本.如何学好脚本,最关键的 ...
- 从windows到linux的shell脚本编码和格式问题
从windows到linux的shell脚本编码和格式问题 从windows到Linux的shell脚本编码和格式问题 1.异常问题 :set ff=unix 启动脚本在启动时报错比如执行sh s ...
- Linux执行shell脚本方式及区别&命令后台运行
Linux执行shell脚本方式及区别&命令后台运行 http://blog.csdn.net/heqiyu34/article/details/19089951/
- Linux简单Shell脚本监控MySQL、Apache Web和磁盘空间
Linux简单Shell脚本监控MySQL.Apache Web和磁盘空间 1. 目的或任务 当MySQL数据库.Apache Web服务器停止运行时,重新启动运行,并发送邮件通知: 当服务器磁盘的空 ...
- Linux:从windows到linux的shell脚本编码和格式
从windows到linux的shell脚本编码和格式问题 异常问题 :set ff=unix 启动脚本在启动时报错比如执行sh start.sh,时会报Command not found等等的错误, ...
- 使用C#给Linux写Shell脚本
在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...
随机推荐
- AngularJS表格排序
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- Question 20171117 Java中的编码问题?
撰文缘由 前几天做一个邮件发送功能,一些常用信息配置在properties文件中,通过prop.getProperty(key)来获取配置的信息,结果配置文件中是用中文写的,邮件发送成功后,邮箱中的激 ...
- 2017-09-26 发布 SpringBoot多模块项目实践(Multi-Module)
https://segmentfault.com/a/1190000011367492?utm_source=tag-newest 2017-09-26 发布 SpringBoot多模块项目实践(Mu ...
- LeetCode 中级 - 从前序与中序遍历序列构造二叉树(105)
一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树. 根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root), 然后在中 ...
- python实现简单决策树(信息增益)——基于周志华的西瓜书数据
数据集如下: 色泽 根蒂 敲声 纹理 脐部 触感 好瓜 青绿 蜷缩 浊响 清晰 凹陷 硬滑 是 乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 是 乌黑 蜷缩 浊响 清晰 凹陷 硬滑 是 青绿 蜷缩 沉闷 清晰 ...
- PHP中有关IPV4 和IPV6地址转换以及其它一些常见问题
这里主要介绍一下 IPV4 / IPV6 在 PHP / MySQL 中如何转换.以及中间容易碰到的一些问题. 首先介绍两个函数: ip2long:将 IPV4 的字符串互联网协议转换成长整型数字 i ...
- [转]Nginx伪静态配置和常用Rewrite伪静态规则集锦
Nginx伪静态配置和常用Rewrite伪静态规则集锦 作者: 字体:[增加 减小] 类型:转载 时间:2014-06-10 我要评论 伪静态是一种可以把文件后缀改成任何可能的一种方法,如果我想把ph ...
- python中的字符串(str)操作
字符串是python中数据类型.一般就单引号(‘’)或双引号(“”)引起来的内容就是字符串. 例如:下面两个都是定义字符串 str1 = "hello world" str2 = ...
- ruby json解析&生成
JSON 通常用于与服务端交换数据. 在接收服务器数据时一般是字符串. 我们可以使用 JSON.parse() 方法将数据转换为 ruby 对象. 一. json字符串解析 require 'json ...
- Redis Handle
package com.jn.baseservice.utils; import com.jn.baseservice.GlobalEntiy.Entity; import com.google.gs ...