`

Shell 基础

阅读更多

 

 

 

一、

1 if语句使用 注意

a=1 #等号两边不能有空格

b=1

if [ $a -eq $b ];then  #if后面要有空格  中括号两边最好留空格否则可能会报错

      echo 11111111110 $a #字符串变量连接处理 

fi

 

二、 中括号内,数值判断

 [ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=

 

 

三、字符串判断

[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ]  如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。

 

 

四、逻辑判断

[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件

 

 

五、文件/目录判断:

例如:
b='/opt/elasticsearch-jdbc-2.3.3.0/bin/statefile.json'
if [ -a $b ];then
 echo 11111111110  
fi
 
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块文件则返回为真。
[ -c FILE ] 如果 FILE 存在且是一个字符文件则返回为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -e FILE ] 如果 指定的文件或目录存在时返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
[ -g FILE ] 如果 FILE 存在且设置了SGID则返回为真。
[ -h FILE ] 如果 FILE 存在且是一个符号符号链接文件则返回为真。(该选项在一些老系统上无效)
[ -k FILE ] 如果 FILE 存在且已经设置了冒险位则返回为真。
[ -p FILE ] 如果 FILE 存并且是命令管道时返回为真。
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
[ -s FILE ] 如果 FILE 存在且大小非0时为真则返回为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID位时返回为真。
[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则返回为真。
[ -G FILE ] 如果 FILE 存在且默认组为当前组则返回为真。(只检查系统默认组)
[ -L FILE ] 如果 FILE 存在且是一个符号连接则返回为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则返回为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则返回为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在则返回为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在则返回为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则返回为真。

   

  判断一个文件是否存在:

#!/bin/bash
_prefix="/usr/local/nginx"
time=`date +%Y%m%d%H`
if [ -s ${_prefix}/logs/access.log ]; then
      echo "${time} hive data" >> /tmp/test.log
else
     echo "${time} no data" >> /tmp/test.log
fi

 

 

六、判断异常退出 

if [ ! -n "$doiido" ]; then
  echo "$doiido is empty"
  exit 0
fi
 
例子:
1 变量相等:
 
if [ "$var1" = "$var2" ]; then
  echo '$var1 eq $var2'
else
  echo '$var1 not eq $var2'
fi
 

 

2:数值的比较:

if [ "$num" -gt "150" ]
echo "$num is biger than 150"
fi
 

 

3:a>b且a<c

(( a > b )) && (( a < c ))
[[ $a > $b ]] && [[ $a < $c ]]
[ $a -gt $b -a $a -lt $c ]

 

4 a>b或a<c

(( a > b )) || (( a < c ))
[[ $a > $b ]] || [[ $a < $c ]]
[ $a -gt $b -o $a -lt $c ]

 

 

5 检测执行脚本的用户

if [ "$(whoami)" != 'root' ]; then
echo "You have no permission to run $0 as non-root user."
exit 1;
fi

 

6 正则匹配

doiido="hero"
if [[ "$doiido" == h* ]];then
echo "hello,hero"
fi

 

7 查看当前操作系统类型

#!/bin/sh
SYSTEM=`uname -s`
if [ $SYSTEM = "Linux" ] ; then
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi

 

 

8 if利用read传参判断

#!/bin/bash
read -p "please input a score:" score
echo -e "your score [$score] is judging by sys now"
 
if [ "$score" -ge "0" ]&&[ "$score" -lt "60" ];then
echo "sorry,you are lost!"
elif [ "$score" -ge "60" ]&&[ "$score" -lt "85" ];then
echo "just soso!"
elif [ "$score" -le "100" ]&&[ "$score" -ge "85" ];then
echo "good job!"
else
echo "input score is wrong , the range is [0-100]!"
fi

 

 

9 判断文件是否存在

#!/bin/sh
today=`date -d yesterday +%y%m%d`
file="apache_$today.tar.gz"
cd /home/chenshuo/shell
if [ -f "$file" ];then
echo "OK"
else
echo "error $file" >error.log
mail -s "fail backup from test" loveyasxn924@126.com <error.log
fi
 

 

10这个脚本在每个星期天由cron来执行。如果星期的数是偶数,他就提醒你把垃圾箱清理

#!/bin/bash
WEEKOFFSET=$[ $(date +"%V") % 2 ]
 
if [ $WEEKOFFSET -eq "0" ]; then
echo "Sunday evening, put out the garbage cans." | mail -s "Garbage cans out" your@your_domain.org
fi

 

 

10 比较包含:

http://www.cnblogs.com/ginsonwang/p/5525340.html 
方法一:利用grep查找
 
strA="long string"
strB="string"
result=$(echo $strA | grep "${strB}")
if [[ "$result" != "" ]]
then
    echo "包含"
else
    echo "不包含"
fi
 
先打印长字符串,然后在长字符串中 grep 查找要搜索的字符串,用变量result记录结果
如果结果不为空,说明strA包含strB。如果结果为空,说明不包含。
这个方法充分利用了grep 的特性,最为简洁。
 

 

方法二:利用字符串运算符

strA="helloworld"
strB="low"
if [[ $strA =~ $strB ]]
then
    echo "包含"
else
    echo "不包含"
fi
利用字符串运算符 =~ 直接判断strA是否包含strB。(这不是比第一个方法还要简洁吗摔!)
 

 

方法三:利用通配符

A="helloworld"
B="low"
if [[ $A == *$B* ]]
then
    echo "包含"
else
    echo "不包含"
fi

 

 

方法四:利用case in 语句

thisString="1 2 3 4 5" # 源字符串
searchString="1 2" # 搜索字符串
case $thisString in 
    *"$searchString"*) echo Enemy Spot ;;
    *) echo nope ;;
esa

 

 

 

方法五:利用替换

STRING_A=$1
STRING_B=$2
if [[ ${STRING_A/${STRING_B}//} == $STRING_A ]]
    then
        ## is not substring.
        echo N
        return 0
    else
        ## is substring.
        echo Y
        return 1
    fi
 

 

 

12  shell ${}简单用法

 

file=/dir1/dir2/dir3/my.file.txt
我们可以用 ${ } 分别替换获得不同的值:
${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt
${file#*.}:拿掉第一个 . 及其左边的字符串:file.txt
${file##*.}:拿掉最后一个 . 及其左边的字符串:txt
${file%/*}:拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值)
${file%.*}:拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
 
记忆的方法为:
# 是去掉左边(在鉴盘上 # 在 $ 之左边)
% 是去掉右边(在鉴盘上 % 在 $ 之右边)
单一符号是最小匹配﹔两个符号是最大匹配。
 
 
${file:0:5}:提取第0个字符开始的连续5个字节:/dir1
${file:5:5}:提取第 5 个字符开始的连续 5 个字符:/dir2
我们也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my

 

 

13 各种字符变量区别 

${ } 用来作变量替换。 
一般情况下,$var 与 ${var} 并没有啥不一样。${ }界限明显,并且有很多截取与替换功能 
 
$( ) 与 ` ` 基本相同
前者视觉效果好,但有些shell不支持,后者在嵌套的时候需要用反斜线做转译,但shell的支持性好 
 
单引号与双引号
单引号告诉shell忽略所有特殊字符,而双引号忽略大多数,但不包括 $、\、`。
反引号里面内容会当成命令执行

 

14、属组的使用

 

 

 

数组定义: a=(2 3 4 5 6 66)

数组长度:echo ${#a[@]}

数组总数据:echo ${a[@]}

数组某一个值:echo ${a[1]}

 

 15、函数返回值

 

get_date(){

   echo '测试=='

}

 

result=`get_date`

echo $result

 $?   获取函数的返回状态

 

 

 

 

分享到:
评论

相关推荐

    学习shell的入门资料(shell十三问+shell基础十二篇)doc版

    本资源包含了两份文档——《shell十三问》和《shell基础十二篇》,是初学者快速掌握Shell编程的优秀教程。 1. **Shell基础知识** - **变量与赋值**:在Shell中,变量可以用来存储各种类型的数据,如字符串、整数。...

    SHELL基础十二篇

    "SHELL基础十二篇"涵盖了初学者必须掌握的基本概念和技能,以下是对这些核心知识点的详细阐述: 1. **Shell简介**:Shell是操作系统与用户交互的接口,它允许用户通过命令行执行系统操作。常见的Shell有Bash...

    Linux系统管理-shell基础1.pdf

    Linux系统管理中的Shell基础主要涉及对Shell这一概念的理解和运用。Shell是用户和操作系统之间交互的一种接口,它提供了一个命令行界面,允许用户输入命令并执行。Shell能够解释用户输入的命令,并调用相应的系统...

    shell基础十二篇.pdf

    ### Linux Shell基础知识详解 #### 一、Shell简介 在Linux操作系统中,Shell是一种用户与操作系统交互的接口。Shell不仅能够执行命令,还可以编写脚本来自动化一系列任务。对于初学者而言,掌握基本的Shell命令和...

    shell基础编程实例

    shell基础编程的一些例子,供查阅使用,涉及到shell脚本使用的某些功能

    shell基础培训

    ### Shell基础培训知识点详解 #### 一、Shell简介与作用 - **定义**: Shell是一种用C语言编写的程序,作为用户与Linux操作系统之间的桥梁。它既是命令语言也是程序设计语言,用户可以通过输入命令来实现对系统的...

    linux-Shell基础视频教程

    10.3.1 Shell基础-Bash基本功能-历史命令与补全.mp4 10.3.2 Shell基础-Bash基本功能-别名与快捷键.mp4 10.3.3 Shell基础-Bash基本功能-输入输出重定向.mp4 10.3.4 Shell基础-Bash基本功能-多命令顺序执行与管道符...

    shell基础教程学习笔记

    "shell基础教程学习笔记" shell 基础知识点总结: 1. Establishment of Shell Scripts: 使用bash(bourne again shell)进行shell编程,在大多数情况下,这些脚本同样可以在bash的大姐,bourne shell 中运行。编写...

    shell编程 创建shell脚本 shell 基础语法 shell流程控制语法 shell函数

    下面将详细介绍创建 Shell 脚本、Shell 基础语法、流程控制语法以及如何定义和使用 Shell 函数。 首先,让我们理解一下 Shell 编程的基础。Shell 是操作系统提供的一种命令解释器,用户通过 Shell 与操作系统进行...

    Shell基础——Shell入门资料

    **Shell基础——Shell入门资料** 在信息技术领域,Linux操作系统因其开放源码、稳定性和灵活性而备受推崇。Linux的用户界面主要是命令行界面,也就是我们常说的终端或控制台,而Shell则是用户与操作系统交互的接口...

    shell基础学习资料

    ### Shell基础学习资料知识点详解 #### 一、Shell脚本的执行与权限设置 - **脚本执行前的声明**:任何Shell脚本都需在第一行声明所使用的Shell解释器,例如`#!/bin/sh`。这里的`#!/bin/sh`表示此脚本将通过`/bin/...

    shell基础入门教程

    **Shell基础入门教程** Shell编程是Linux和Unix操作系统中的一种命令解释器,它允许用户通过命令行与系统交互,执行各种任务。本教程将引导初学者逐步了解并掌握Shell编程的基础知识。 ### 1. Shell简介 Shell是...

    CShell基础知识详解

    ### CShell基础知识详解 #### 一、引言 在之前的讨论中,我们已经涉及了许多Cshell的功能,例如命令别名、作业控制等。此外,任何一系列Cshell命令都可以存储在一个文件中,并通过调用Cshell来执行这些命令。这样...

    shell基础12篇电子书shellchoki.chm

    总之,Shell基础包括脚本编写、变量管理、环境变量的使用以及条件测试等,掌握这些基础知识对于高效地管理和自动化Linux系统任务至关重要。通过编写和理解Shell脚本,用户可以更好地理解和控制他们的操作系统。

    shell基础12篇13问

    shell是直接与内核进行交互,属于比用户程序层更深入的一种程序语言。shell的简单,高效,优雅,基础问答,让你对shell有初步了解

    shell基础 (pdf) txt版 ,适合于初级和高级shell编程者

    这份"shell基础"的学习资料,无论是对初学者还是有一定经验的shell编程者,都是一份非常宝贵的资源。以下是根据标题和描述提炼出的shell基础知识要点,我们将深入探讨这些主题。 1. **Shell介绍**:Shell是用户与...

    京峰教育Linux Shell基础编程

    京峰教育 Linux Shell 基础编程知识点总结 本资源摘要信息涵盖了 Linux Shell 基础编程的知识点,包括 Shell 编程入门、变量、If、While、For、Case、Select 基本语句案例演练、Find、Grep、Awk、Sed 四剑客深度...

    shell基础知识

    最近在学习shell,找了很多资料,这个是其中不错的shell基础知识讲解,虽然比较基础,但是很容易懂~

    03 Shell基础实验

    Shell基础实验是Linux或Unix操作系统中的重要组成部分,它是一种命令行解释器,允许用户与操作系统进行交互。在本次实验中,我们将深入理解Shell的基本概念、常用命令以及脚本编写技巧。通过实践,你可以掌握如何...

    shell基础学习资料.rar

    本压缩包"shell基础学习资料.rar"包含的资源显然是为了帮助初学者掌握Shell的基础知识。以下是关于Shell的一些关键知识点的详细说明: 1. **Shell类型**:Linux中有多种Shell,比如Bash(Bourne-Again SHell)、Sh...

Global site tag (gtag.js) - Google Analytics