一.布尔运算符列表

a=10
b=20

!
非运算,表达式为 true 则返回 false,否则返回 true。
[ ! false ] 返回 true。

-o
或运算,有一个表达式为 true 则返回 true。
[ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a
与运算,两个表达式都为 true 才返回 true。
[ $a -lt 20 -a $b -gt 100 ] 返回 false

例:if判断变量非空

#!/usr/bin/env bash

a="x"

if [ ! $a ];then

  echo "ls null"

else

  echo "not is null"

fi

输出 not is null

二.字符串运算符列表

a=abc
b=fds

=
检测两个字符串是否相等,相等返回 true。
[ $a = $b ] 返回 false。

!=
检测两个字符串是否相等,不相等返回 true。
[ $a != $b ] 返回 true。

-z
检测字符串长度是否为0,为0返回 true。
[ -z $a ] 返回 false。//判断:如果字符串a为0。此处不为0,返回false

-n
检测字符串长度是否为空,不为空返回 true。
[ -n $a ] 返回 true。 //判断:如果字符串a为非空。此处为非空,返回true

str
检测字符串是否为空,不为空返回 true。
[ $a ] 返回 true。

三.文件测试运算符列表
例如,变量 file 表示文件“xxx.sh”,它的大小为100字节,具有 rwx 权限。

-b file
检测文件是否是块设备文件,如果是,则返回 true。
[ -b $file ] 返回 false。

-c file
检测文件是否是字符设备文件,如果是,则返回 true。
[ -b $file ] 返回 false。

-d file
检测文件是否是目录,如果是,则返回 true。
[ -d $file ] 返回 false。

-f file
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
[ -f $file ] 返回 true。

-g file
检测文件是否设置了 SGID 位,如果是,则返回 true。
[ -g $file ] 返回 false。

-k file
检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
[ -k $file ] 返回 false。

-p file
检测文件是否是具名管道,如果是,则返回 true。
[ -p $file ] 返回 false。

-u file
检测文件是否设置了 SUID 位,如果是,则返回 true。
[ -u $file ] 返回 false。

-r file
检测文件是否可读,如果是,则返回 true。
[ -r $file ] 返回 true。

-w file
检测文件是否可写,如果是,则返回 true。
[ -w $file ] 返回 true。

-x file
检测文件是否可执行,如果是,则返回 true。
[ -x $file ] 返回 true。

-s file
检测文件是否为空(文件大小是否大于0),不为空返回 true。
[ -s $file ] 返回 true。

-e file
检测文件(包括目录)是否存在,如果是,则返回 true。
[ -e $file ] 返回 true。

四.单双引号的区别

str='this is a string'

单引号字符串的限制:
· 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
· 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
双引号的优点:
· 双引号里可以有变量
· 双引号里可以出现转义字符

五.获取字符串长度
string="abcd"
echo ${#string} #输出 4

提取子字符串
string="alibaba is a great company"
echo ${string:1:4} #输出liba

六.数组

定义数组
在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
array_name=(value1 ... valuen)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
可以不使用连续的下标,而且下标的范围没有限制。

读取数组
读取数组元素值的一般格式是:
${array_name[index]}
例如:
valuen=${array_name[2]}
举个例子:

#!/bin/sh

NAME[]="Zara"
NAME[]="Qadir"
NAME[]="Mahnaz"
NAME[]="Ayan"
NAME[]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"

运行脚本,输出:
sh test.sh
First Index: Zara
Second Index: Qadir

使用@ 或 * 可以获取数组中的所有元素,例如:
${array_name[*]}
${array_name[@]}

举个例子:

#!/bin/sh

NAME[]="Zara"
NAME[]="Qadir"
NAME[]="Mahnaz"
NAME[]="Ayan"
NAME[]="Daisy"
echo "First Method: ${NAME[*]}"
echo "Second Method: ${NAME[@]}"

运行脚本,输出:
sh test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同
例如:
获取字符串长度
aaa="hjfljfoijf"
echo "${#aaa}"

获取数组的长度
取得数组元素的个数
length=${#array_name[@]}
或者
length=${#array_name[*]}
取得数组单个元素的长度
length=${#array_name[n]}
echo "${#length}"

七.显示转义字符

echo "\"It is a test\""
结果将是:
"It is a test"

双引号也可以省略。

八.echo和read

输出:echo
-e 解释转义字符
\n 回车
\t 制表符
\b 回退 baskspace 删除键

-n 回车不换行

自定义格式输入:read
-p 打印输出
-n 接受多少个用户输入的字符
-s 关闭回显 需要放在前面,不然会报错
-t 等待超时

九.循环语句if...else
if ... else 语句也经常与 test 命令结合使用,如下所示:(test了解就行,个人感觉太鸡肋,基本没用过)

num1=$[*]
num2=$[+]
if test $[num1] -eq $[num2];then
echo 'The two numbers are equal!'
else
echo 'The two numbers are not equal!'
fi

输出:
The two numbers are equal!

等同于

num1=$[*]
num2=$[+]
if [ $num1 -eq $num2 ];then
echo 'The two numbers are equal!'
else
echo 'The two numbers are not equal!'
fi

test 命令用于检查某个条件是否成立,与方括号([ ])类似。

十.case ... esac
case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。

case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)
command1
command2
command3 ;;
模式2)
command1
command2
command3 ;;
*)
command1
command2
command3 ;;
esac

例1:创建一个脚本,脚本名为/opt/script.sh让其提供一下特性:
a) 当运行/opt/script.sh all时,输出none
b) 当运行/opt/script.sh none时,输出all
c) 当没有任何参数或者参数不是all、none时,其错误输出产生一下的信息:Usage:/opt/script.sh none|all

#!/usr/bin/env bash
case $ in
all)
echo "none";;
none)
echo "all";;
*)
echo "Usage:/opt/script.sh none|all";;
esac

例2:提示输入1到4,与每一种模式进行匹配

#!/usr/bin/env bash
echo "Input a number between 1 to 4"
echo "Your number is:"
read var
case $var in
) echo "You select 1";; ) echo "You select 2";; ) echo "You select 3";; ) echo "You select 4";; *) echo "You do not select a number between 1 to 4";; esac

case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

十一.循环语句for
与其他编程语言类似,Shell支持for循环。

for循环一般格式为:
for 变量 in 列表
do
command1
command2
...
commandN
done

列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。

in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。

例如,顺序输出当前列表中的数字:

for loop in
do
echo "The value is: $loop"
done

运行结果:
The value is: 1The value is: 2The value is: 3The value is: 4The value is: 5

顺序输出字符串中的字符:

for str in 'This is a string'
do
echo $str
done

运行结果:
This is a string

显示主目录下以 .bash 开头的文件:

#!/bin/bash

for FILE in $HOME/.bash*
do
echo $FILE
done

运行结果:
/root/.bash_history/root/.bash_logout/root/.bash_profile/root/.bashrc

还可以这样用
for i in {1..5}
for i in `seq 1 5`

还支持类C用法如:
for ((i=1;i<10;i++))
do
代码块
done

十二.循环语句while
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while command
do
Statement to be executed
if command is true
done

例:
while [ $i -lt 10 ]
do
代码块
i=$((i+1))
done

例:
循环输出hello

while :    # :该条件恒为真,
do
echo "Hello"
sleep
done

命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。

while循环可用于读取键盘信息。
例:输入信息被设置为变量FILM,按<Ctrl-D>结束循环。

echo "type <CTRL-D> to terminate"
echo -n "enter your most liked film: "
while read FILM
do
echo "Yeah! great film the $FILM"
done

十三.循环语句until
until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。
until条件循环
until 直到...时候
语法:
until [ 条件 ]
do
代码块
done
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环。

shell 学习笔记一的更多相关文章

  1. SHELL学习笔记----IF条件判断,判断条件

    SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here   ...

  2. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

  3. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  4. shell学习笔记汇总

    1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...

  5. shell 学习笔记2-shell-test

    一.字符串测试表达式 前面一篇介绍:什么是shell,shell变量请参考: shell 学习笔记1-什么是shell,shell变量 1.字符串测试表达式参数 字符串需要用""引 ...

  6. SHELL学习笔记三

    SHELL学习笔记一 SHELL学习笔记二 SHELL学习笔记三 for 命令 读取列表中的复杂值 从变量读取列表 从命令读取值 更改字段分隔符 用通配符读取目录 which 使用多个测试命令 unt ...

  7. 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等

    1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...

  8. [Bash Shell] Shell学习笔记

    1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...

  9. shell 学习笔记

    <Linux命令行与shell脚本编程大全>笔记   wkss 其他:http://www.cnblogs.com/pengdonglin137/p/3528303.html 一.基本命令 ...

  10. CentOS 7 之Shell学习笔记

    脚本是个永恒的话题,以前Dos下面也有Shell编程这一说的,比如说BAT文件有人写的好的话,也是瞬间速度变高大上.Linux下面这个应该更占比重了.我看到园子里有位园友做了一个Linux Shell ...

随机推荐

  1. python3 小数据池

    '''小数据池:为了重复的使用同一个数据str(一般的,简单的)int -5~256bool True False3个数据类型会被放入小数据池id()取变量的内存地址字符串'''# s1 = &quo ...

  2. HDU2066(SPFA+前向星)

    https://vjudge.net/problem/HDU-2066 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白 ...

  3. Objective-C GCD深入理解

    GCD(Grand Central Dispatch),主要用于多线程编程.它屏蔽了繁琐的线程实现及管理细节,将其交由系统处理.开发者只需要定义任务block(在底层被封装成dispatch_cont ...

  4. AliOS-Things Visual studio code helloworld 入门

    配置环境的时候别忘了下载:GCC工具链:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads AliOS Thing ...

  5. MongoDB的数据类型介绍

    参考MongoDB官网:https://docs.mongodb.com/manual/reference/bson-types/ MongoDB文档存储是使用BSON类型,BSON(BSON sho ...

  6. 解析 STM32 的库函数

    解析 STM32 的库函数意法半导体在推出 STM32 微控制器之初,也同时提供了一套完整细致的固件开发包,里面包含了在 STM32 开发过程中所涉及到的所有底层操作.通过在程序开发中引入这样的固件开 ...

  7. Luogu4606 SDOI2018 战略游戏 圆方树、虚树、链并

    传送门 弱化版 考虑到去掉一个点使得存在两个点不连通的形式类似割点,不难想到建立圆方树.那么在圆方树上对于给出的关键点建立虚树之后,我们需要求的就是虚树路径上所有圆点的数量减去关键点的数量. 因为没有 ...

  8. Luogu3164 CQOI2014 和谐矩阵 异或高斯消元

    传送门 题意:给出$N,M$,试构造一个$N \times M$的非全$0$矩阵,其中所有格子都满足:它和它上下左右四个格子的权值之和为偶数.$N , M \leq 40$ 可以依据题目中的条件列出有 ...

  9. HTML5-应用程序缓存(Application Cache)

    一.什么是应用程序缓存? HTML5 引入了应用程序缓存(Application Cache),这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 二.优势 离线浏览 - 用户可在应用 ...

  10. [Spark][Hive]Hive的命令行客户端启动:

    [Spark][Hive]Hive的命令行客户端启动: [training@localhost Desktop]$ chkconfig | grep hive hive-metastore 0:off ...