SHELL编程基础01
首先shell是在linux下运行的一种环境,它是以shell脚本来运行的,学会了它基本可以解决任何问题,也可以用shell脚本开发。
和java,python的相比,其弱类型的语言没有那么复杂的结构,编程讲究习惯,写代码时也要遵循这个习惯,就像这个是老祖宗 定的规则一样
shell脚本代码习惯
我整理了一些大家当做参考:
1 数字不加引号
单引号表示字符串或者固定不变的字符
其他都用双引号
2 写脚本第一行加入#!/bin/bash sh脚本的习惯(不要问什么)
变量
变量是存储的数据的方式
只读变量
#!/bin/sh
NAME="nihaoma"
readonly NAME
NAME="wobuhaoa"
这样变量会报错,因为设置了只读
取消定义变量
unset 变量名称


如果变量没有被定义可以用echo ${变量名:-自定义内容} ,返回自定义内容。如果有定义返回变量值,此可判断变量没有定义,确保变量有值

=,表示如果变量没有定义,直接给变量赋自定义的值
变量的类型
变量类型分为全局变量,局部变量和shell变量(shell自带的变量)
shell特殊变量
$0 获取文件当前的文件名 包括路径
$n 获取当前执行shell脚本的第n个参数 n=1...9 如果n>9 用大括号 ${10}
sh n.sh das 213d
脚本里面写 echo $1 $2 $3
运行sh n.sh das 213d
结果为das 213d 其对应的就是脚本后面的参数,$3没有>参数就没了
$! 执行上一个指令的PID
$* 获取当前shell的所有参数 $1 $2 $3 ...
$# 执行命令行参数的总个数
dirname $0 取全路径
basename $0 取名称
$? 对于上一个命令判断是否成功成功返回0
2权限拒绝 1-125运行失败 126找到命令但是无法执行 127未找到该命令 >128命令被强制结束
$$ 取进程号
$@ 这个程序的所有参数 $1 $2 $3
$_ 在此之前执行的命令或脚本的最后一个参数
shift语句
其按照如下方式重新命名所有位置参数变量,即$2成为$1,$3成为$2***在程序中每使用一次shift语句,都使所有的位置参数依次向移动一个位置,并使位置参数$#减1,直到减到0为止
变量的获取

↑查看变量字符数 或者echo $a | wc -m

↑取第三个字符到结尾 也可以理解成删除前两个字符

↑取第三个字符总共两个
或者 echo ${a} |cut -c 3-4

↑从开头删除最短匹配的字符,##最长

↑从结尾删除最短匹配的,%%最长
${变量/旧字符串/新字符串} 若变量内容符合“旧字符串”,则首个旧字符会被新字符替换。
${变量/旧字符串//新字符串} 若变量内容符合“旧字符串”,则全部旧字符会被新字符替换。
批量文件名修改实战
将下面文件用shell去除_strong
chen_1995_1_2_strong.jpg
chen_1995_1_3_strong.jpg
chen_1995_1_4_strong.jpg
chen_1995_1_5_strong.jpg
1.首先造数据
vi a.log ,将文件名复制进去
2.写造数据的shell命令
for f in `cat a.log`;
do `touch $f`;
done
3.写修改文件名的shell脚本
vi aaa.sh
for f in `ls *.jps`
do
mv $f `echo ${f%_strong*}.jpg`;
done
替换也是一样,批量改名

rename .JPG .HTML *.jpg
原来的名称 改的名称 原来文件名
shell计算方式
普通计算



命令行传参

let计算

expr 计算

注意:中间要加空格否则不累加 乘号前面要加转义符,除号后面试了下可以不加
bc 计算(支持小数)

bc计算可以通过管道符也可以直接bc进入bc运算,最后试了下好像也不支持小数
DATE时间获取
#!/bin/bash
YY=`date +%Y` #获取年
echo $YY mm=`date +%m` #获取月
echo $mm DD=`date +%d` #获取日
echo $DD HH=`date +%H` #获取小时
echo $HH MM=`date +%M` #获取分
echo $MM dd=`date +%S` #获取秒
echo $dd
hello=$YY$mm$DD$HH$MM$dd
echo $hello bigone=`date +%Y%m%d%H%M%S` #获取精确时间
echo $bigone a=
b= if [ $hello -eq $bigone ]
then echo true
else
echo false fi
if判断
条件表达式
[ aaaa ] -eq [ bbbb ] 中括号两边要带空格
-eq 测试两个整数是否相等
-ne 测试两个整数是否不等
-gt 测试一个数是否大于另一个数
-lt 测试一个数是否小于另一个数
-ge 大于或等于
-le 小于或等于
组合测试条件
-a: and
-o: or
!: 非
逻辑与:&&
第一个条件为假 第二个条件不用在判断,最总结果已经有
第一个条件为真,第二个条件必须得判断
逻辑或:||
只要有一个条件为真,直接判断为真
字符串比较
== 等于 两边要有空格
!= 不等
> 大于
< 小于
文件判断
-z string 测试指定字符是否为空,空着真,非空为假
-n string 测试指定字符串是否为不空,空为假 非空为真
-e FILE 测试文件是否存在
-f file 测试文件是否为普通文件
-d file 测试指定路径是否为目录
-r file 测试文件对当前用户是否可读
-w file 测试文件对当前用户是否可写
-x file 测试文件对当前用户是都可执行
-z 是否为空 为空则为真
-a 是否不空
a="sadasdasd"
if
[ -z $a ];
then echo kong
else echo bukong
fi
if语法
if 判断条件 0为真 其他都为假
单分支if语句
if 判断条件;then
statement1
statement2
.......
fi
双分支的if语句
复制代码
if 判断条件;then
statement1
statement2
.....
else
statement3
statement4
fi
如下:
read -p "please input your grade:" x
declare -i x
if [ "$x" == "" ];then
echo "you must input the word in it"
exit
fi
if
[ $x -eq ];then echo "你已经超神了"
elif
[ $x -ge -a $x -le ];then echo "变态杀戮"
elif
[ $x -ge -a $x -le ];then echo "大波kill"
elif
[ $x -ge -a $x -le ];then echo "one kill"
elif
[ $x -ge -a $x -le ];then echo "first brood"
elif
[ $x -ge -a $x -le ];then echo "对面已经超神了"
else
echo "非异常处理"
fi
case..esac语句
#!/bin/sh
FRUIT="balabala"
case "$FRUIT" in
"apple") echo "Apple pie is quite tasty."
;;
"banana") echo "I like banana nut bread."
;;
"balabala") echo "New Zealand is famous for balabala."
;;
esac
格式跟c差不多
shell循环类型 while,for,until,select循环
while 循环直到达到条件循环停止
#!/bin/sh
a=
while [ $a -lt ]
do
echo $a
a=`expr $a + `
done
for for var in word1 word2 ... wordN
#!/bin/sh #执行in后面的数并打印
for var in
do
echo $var
done
#!/bin/sh #home目录下打印跟.bash后面所有的文件
for FILE in $HOME/.bash*
do
echo $FILE
done
#这将产生以下结果:
/root/.bash_history
/root/.bash_logout
/root/.bash_profile
/root/.bashrc
util
#!/bin/sh #util英文是直到的意思,解释就是直到a=10的时候循环才结束
a=
until [ ! $a -lt ]
do
echo $a
a=`expr $a + `
done
select
语法:
select var in word1 word2 ... wordN
do
Statement(s) to be executed for every word.
done
#!/bin/ksh
select DRINK in tea cofee water juice appe all none
do
case $DRINK in
tea|cofee|water|all)
echo "Go to canteen"
;;
juice|appe)
echo "Available at home"
;;
none)
break
;;
*) echo "ERROR: Invalid selection"
;;
esac
done
break&continue
break 结束整个循环
#!/bin/sh
a=
while [ $a -lt ]
do
echo $a
if [ $a -eq ]
then
break
fi
a=`expr $a + `
done
continue 终止本次循环执行下一次循环
shell替换
#!/bin/sh
DATE=`date`
echo "Date is $DATE"
USERS=`who | wc -l`
echo "Logged in user are $USERS"
UP=`date ; uptime`
echo "Uptime is $UP"
结果:

shell 定时清理
如果要清理tomcat下的logs日志,首先定义脚本存放目录
创建脚本代码如下
#!/bin/bash
find /usr/local/tomcat/logs/ -mtime -name "*.log" -exec rm -rf {} \;
find /usr/local/tomcat/logs/ -mtime -name "*.txt" -exec rm -rf {} \;
之后crontab -e 脚本如下
30 0 * * * 脚本路径 脚本文件
shell数组
定义数组值
array_name[index]=value 数据名[下标]=值
如果您使用的是ksh shell在这里初始化数组的语法:
set -A array_name value1 value2 ... valuen
如果您使用的是bash shell中,这里是初始化数组的语法:
array_name=(value1 ... valuen)
访问数组值
${array_name[index]} 访问指定下标
${array_name[*]} 访问所有
${array_name[@]} 访问所有
版权声明:本文原创发表于 博客园,作者为 RainBol本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
SHELL编程基础01的更多相关文章
- shell编程基础-01
1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的 ...
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- shell编程基础(转载)
Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- Linux学习之二十一-shell编程基础
Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...
- 7-1 shell编程基础之二
shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...
- 6-2 shell编程基础
shell编程基础 编程基础 Linus:Talk is cheap, show me the code 程序和编程风格 程序: 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结 ...
- 基于Linux系统的Shell编程-基础篇
1. Shell基础介绍 1.1 Shell编程的意义 为什么使用shell编程 节约时间 1.2 显示脚本执行过程 前面有+表示执行过的命令的 前面没有东西,表示输出到屏幕上的内容. [root@C ...
随机推荐
- 【GStreamer开发】GStreamer基础教程06——媒体格式和pad的Capabilities
目标 Pad的Capabilities是一个GStreamer element的基础,因为framework大部分时间是自动处理的,所以我们几乎感觉不到它的存在.本教程比较偏向原理,介绍了 ...
- Appium移动自动化测试-----(十一)appium API 之键盘操作
模拟键盘输入也是非常重要的操作.这一小节来介绍那些关于键盘的操作. 1.sendKeys()方法 方法: sendKeys() 用法: driver.findElements(By.name(&quo ...
- js获取下拉框的值
获取select 选中的option的值: $("#ddlRegType").find("option:selected").val(); 获取select ...
- (3)Spring Boot日志
文章目录 选择哪一种日志框架 日志的使用 Spring Boot 日志使用 选择哪一种日志框架 市面上日志门面有: JCL(Jakart Commons Logging) .SLF4J(Simple ...
- linux安装png2icon方法
此工具用于将png图片转换为ico格式的文件,一个小工具,但很实用 官网:http://www.winterdrache.de/freeware/png2ico/ 下载: wget http://ww ...
- Centos 安装PHP-redis扩展
从https://pecl.php.net/package/redis 里面找到自己安装的Redis对应版本的redis 1.获取已经安装的Redis版本扩展我这边安装的是4.0.1版本 wget ...
- android studio 开发环境配置
android studio 开发环境配置 参考: 第一次使用Android Studio时你应该知道的一切配置 https://www.cnblogs.com/qianguyihao/p/43909 ...
- 快开宝PDA开单器出入库扫码:让批发零售变得更简单
快开宝PDA开单器出现前 批发商户是这样开单和管理的 ★员工痛苦:需要记客户.价格.库存等等,应对报错价.错漏单.盘错货等各种状况. ★老板麻烦:每天要守店.对单.核账,经常因错漏单.库存乱.积压货. ...
- 洛谷P3372--线段树代码模板1
如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格 ...
- win10如何安装mariadb
一.下载.安装 1.下载mariadb(https://downloads.mariadb.org/),解压 2.进入bin目录下执行(管理员模型-powershell) .\mysqld.exe - ...