shell 学习笔记一

一.布尔运算符列表

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"! "
双引号的优点:
· 双引号里可以有变量
· 双引号里可以出现转义字符


五.获取字符串长度
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[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="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[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="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 解释转义字符
回车
制表符
 回退 baskspace 删除键

-n 回车不换行


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

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

num1=$[2*3]
num2=$[1+5]
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=$[2*3]
num2=$[1+5]
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 $1 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
1) echo "You select 1";;

2) echo "You select 2";;

3) echo "You select 3";;

4) 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 1 2 3 4 5
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 3
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 来跳出循环。

原文地址:https://www.cnblogs.com/dannylinux/p/8144519.html