首先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的更多相关文章

  1. shell编程基础-01

    1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的 ...

  2. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  3. shell编程基础(转载)

    Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...

  4. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  5. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  6. Linux学习之二十一-shell编程基础

    Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...

  7. 7-1 shell编程基础之二

    shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...

  8. 6-2 shell编程基础

    shell编程基础 编程基础 Linus:Talk is cheap, show me the code 程序和编程风格 程序: 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结 ...

  9. 基于Linux系统的Shell编程-基础篇

    1. Shell基础介绍 1.1 Shell编程的意义 为什么使用shell编程 节约时间 1.2 显示脚本执行过程 前面有+表示执行过的命令的 前面没有东西,表示输出到屏幕上的内容. [root@C ...

随机推荐

  1. python 最麻烦的时间有药了

    https://www.cnblogs.com/sunshineyang/p/6818834.html 一:经常使用的时间方法 1.得到当前时间 使用time模块,首先得到当前的时间戳 In [42] ...

  2. [US Open 2004][luogu2342] 叠积木 [带权并查集]

    题面 洛谷传送门 思路 害 学了4年多OI,第一次知道还有带权并查集这个东西 wtcl 这个玩意儿的原理和详细实现,可以参考这个博客:带权并查集传送门 这道题,就是在带权并查集的基础上,加个维护每个集 ...

  3. [转帖]MyCat教程【简单介绍】

    MyCat教程[简单介绍] 2019-10-15 10:27:23 波波烤鸭 阅读数 618 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...

  4. 17. Scala泛型、上下界、视图界定、上下文界定

    17.1 泛型的基本介绍 17.1.1 基本介绍 1) 如果我们要求函数的参数可以接受任意类型,可以使用泛型,这个类型可以代表任意的数据类型 2) 例如List,在创建List时,可以传入整型.字符串 ...

  5. ASP.net Web API综合示例

    目录 概述 功能介绍 程序结构 服务器端介绍 客户端介绍 “契约” Web API设计规则 并行写入冲突与时间戳 身份验证详解 Web API验证规则 客户端MVVM简介 Web.Config 本DE ...

  6. Mac下Sublime Text3激活码

    方法1: 终端中打开文件 /etc/hosts,插入如下语句 127.0.0.1 www.sublimetext.com 127.0.0.1 license.sublimehq.com 方法2: 在s ...

  7. 在论坛中出现的比较难的sql问题:19(row_number函数 行转列、sql语句记流水)

    原文:在论坛中出现的比较难的sql问题:19(row_number函数 行转列.sql语句记流水) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记 ...

  8. ASP.NET Core利用拦截器 IActionFilter实现权限控制

    “麦荻网教系统”采用了前后端代码分离的架构,即“Miidy.Cloud.Console”站与“Miidy.Cloud.Manage”站(两个前端站)同时通过web api的方式调用“Miidy.Clo ...

  9. VBA字符串(十二)

    字符串是一个字符序列,可以由字母,数字,特殊字符或全部字符组成. 如果一个变量被包含在双引号""中,则被认为是一个字符串. 语法 variable_name = "thi ...

  10. mysql中常用的数据类型

    MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语 ...