一.布尔运算符列表

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. Python package和module

    package,即包,可以把功能相近的module(模块)组织在一起,以便更好地管理.Java中也有包的概念,作用类似,是为了更好地管理类和接口.package,说白了就是个目录,不过这个目录下一定要 ...

  2. Objective-C 在main函数之前的过程

    main函数是我们所熟知的程序入口,Java.Python.C++等,虽语法各异,但皆是如此.然而,程序真正的起点并非main函数,在此之前,就已经干了很多事情. 1.在main函数打个断点,从调用栈 ...

  3. 用Qt程序打开.txt 文件的时候,出现乱码的情况

    打开*.txt 文件出现乱码的情况,说明编码格式不对,一般的Windows下创建的txt 文件,到ubuntu 系统中打开会出现乱码的情况, 下面的代码读取文件,并且转化编码格式 void MainW ...

  4. php计算utf8字符串长度

    strlen()函数计算中文字符不太友好.扩展的mb_strlen()函数可以补充这个.如果没有这个扩展,也可以利用正则匹配分解. 函数如下: // 对utf-8字符的长度 function utf8 ...

  5. 如何传递参数给ASP.NET Core的中间件(Middleware)

    问题描述 当我们在ASP.NET Core中定义和使用中间件(Middleware)的时候,有什么好的办法可以给中间件传参数吗? 解决方案 在ASP.NET Core项目中添加一个POCO类来传递参数 ...

  6. 两个非常好的bootstrap模板,外送大话设计模式!

    两个非常好的bootstrap模板,外送大话设计模式! 下载地址:http://download.csdn.net/download/wolongbb/10198756

  7. ORA-12638:Credential retrieval failed(身份证明检索失败)解决方法

    版本:oracle 11g 解决方法: 在sqlnet.ora中设置SQLNET.AUTHENTICATION_SERVICES= 0.本人亲自验证,可以解决此问题. 网上说设置SQLNET.AUTH ...

  8. [JDBC]你真的会正确关闭connection吗?

    Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { conn = DriverManag ...

  9. ABP+AdminLTE+Bootstrap Table权限管理系统第三节--abp分层体系,实体相关及ABP模块系统

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 ABP模块系统 说了这么久,还没有详细说到abp框架,abp其实基于DDD(领域驱动设计)原则的细看分层如下: 再 ...

  10. WordPress更新时提示无法连接到FTP服务器的解决方案

    这几天在搭建主站的时候,更新wordpress时无法连接到FTP原因服务器 解决方法如下: 在WordPress目录下找到wp-config.php文件并编辑,在最后一行加上: define('FS_ ...