一.布尔运算符列表

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. MATLAB中的FOR循环问题

    做量化操作的时候经常需要使用到matlab编写策略或者计算多因子,for循环非常慢,自己找了一些matlab中for循环的优化方法,for的部分每处理一个大矩阵都要花费大量的时间,这是不可避免需要遇到 ...

  2. webpack2 项目构建一

    最近工作忙,学习被暂停了,还是网上多看看资料,多学习学习一下,看到一些好的资料,自己想整理一下,这不,webpack2项目构建都还没有弄懂,webpack3就已经发布了,说实话周末现在真不想看书和研究 ...

  3. AI 数值计算

    数值计算,通过迭代来更新解的估计值. 1.上溢和下溢 实数按照一定的精度存储在计算机中,通常存在误差,进而可能导致一些错误. 1)下溢(underflow),例如接近0的数 2)上溢(overflow ...

  4. MySQL 基础六 临时表 复制表结构

    1.临时表CREATE TEMPORARY TABLE test2( id INT ) SELECT *FROM test2 SHOW TABLES; INSERT INTO test2 VALUES ...

  5. battery for stm32

    右边两个1N4148的压降都是0.7V,并且3.3-0.7=2.6V   &   3-0.7=2.3V  可见在电源3.3V正常供电的情况下,电池处于休息状态,这就有效避免了电池的不必要消耗:

  6. C. K-Dominant Character

    给出一个字母串,k满足:长度至少为k的字串一定包含某字母c,求最小的k 一个数组记录每个字母上一次出现的位置,用来计算另一个数组:记录每个字母与其相邻的相同字母的最大距离(设0和len两个位置一定有相 ...

  7. LeetCode202:Happy Number 。C#版,在vs2010中通过,leetcode中Wrong Answer

    static List<int> nums = new List<int>(); public static bool IsHappy(int n) { int newint ...

  8. tmux 复制粘贴

    tmux版本(tmux 2.3): $tmux -V 要想让tmux和系统剪贴板之间互相复制粘贴,在linux中需要先安装 xclip: sudo apt-get install xclip 然后在 ...

  9. Oracle 社区动态、中文讲座,最佳实践

    https://community.oracle.com/thread/3789691https://community.oracle.com/community/support/%E4%B8%AD% ...

  10. flask-admin 快速打造博客 系列一

    前言: 我想分享flask+flask-admin快速打造博客的详细教程,可是发现网易课堂已经有相应的免费课堂了,所以就不打算一点一滴的在这里做笔记,分享这些东西了.所以我主要集中在flask-adm ...