Shell 教程 | 菜鸟教程
快速入门shell脚本编写(一)_hnulwt的博客-CSDN博客_shell脚本编写
linux+sh+路径拼接,Shell字符串拼接(连接、合并)_由宓的博客-CSDN博客
shell脚本----if(数字条件,字符串条件,字符串为空)_知耻而后勇的蜗牛的博客-CSDN博客_bash 字符串对比
Shell 传递参数 | 菜鸟教程
Linux shell 中获取当前目录的方法_sayyy的博客-CSDN博客_shell当前目录
linux shell 中判断字符串为空的正确方法 - katago - 博客园
shell脚本报错:"[: =: unary operator expected"_viclee108的博客-CSDN博客
在 Shell 脚本中调用另一个 Shell 脚本的三种方式_liuchengxu_的博客-CSDN博客_shell脚本中执行另一个脚本
CRTDIR=$(pwd)#在shell中也可以使用pwd来获取当前目录,并赋值给变量。
变量定义:
例子:varibleName="value"
首先有一点,变量名和等号之间不能有空格,这点千万注意,因为我们平时写其他程序的时候可能已经养成了这种习惯,在shell这里需要注意这个习惯,
然后要知道的一些变量命名规则:
1,首个字符必须为字母(a-z,A-Z)。
2,中间不能有空格,可以使用下划线(_)。
3,不能使用标点符号。
4,不能使用bash里的关键字(可用help命令查看保留关键字)。
定义好变量我们就要开始使用变量了,如何使用变量,需要在自己定义的变量名上加上大括号,然后最前面写上$字符,例如
who="dog"
echo who is ${who}?
=================================
shell中一些比较特殊的变量:
特殊变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
=========脚本文件test.sh========
#! /bin/bash
value=`expr 2 + 2` #在第二行中注意赋值地方是没有空格的,而在计算表达式的时候之间是有空格的。 expr 2 + 2表达式被 ` 号括起来。注意 · 号并不是单引号,而是键盘上Esc下面的符号
echo "Total value :${value}"
a=10
b=20
value=`expr 2 + 2`
echo "Total value :${value}"
value=`expr $a \* $b`
echo "a * b : ${value}"
value=`expr $b % $a`
echo "a % b : ${value}"
if [ $a == $b ] #条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]
then
echo "a equals b"
fi
if [ $a != $b ]
then
echo "a not equals b"
fi
#######
if [ $a -eq $b ]
then
echo "$a -eq $b"
else
echo "a not equals b "
fi
if [ $a -gt $b ]
then
echo "$a gt $b"
else
echo "a not greater than b"
fi
if [ $a -le $b ]
then
echo "$a le $b"
else
echo "a not less or equal to b"
fi
gt=greater than
ge=greater &equal
lt=little than
le=little &equal
关系运算符列表
运算符 |
说明 |
举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true | [ $a -eq $b ] 返回 true。 |
-ne | 检测两个数是否相等,不相等返回 true | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大等于右边的,如果是,则返回 true | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true | [ $a -le $b ] 返回 true。 |
布尔运算符
先大致熟悉一下布尔相关的三个运算符
! 非运算
-o 或运算(or)
-a 与运算(and)
字符串 和 字符串运算符
提到了字符串,先讲讲shell中的字符串,他大概是shell中最常用的数据类型了(貌似除了他也没有其他类型了),先来看看字符串的表示方式
字符串可以用单引号,也可以用双引号,也可以不用引号
单引号
俩点需要注意:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)
双引号
双引号基本没有什么限制,一般常用双引号,双引号里面可以使用转义字符,可以带入变量
例:
1 animal="dog"
2 say="Hi, \"$animal\""
3
4 echo $say
运行结果:
$ sh teststr.sh
Hi, "dog"
可以看出俩个冒号被转义了,animal代表的字符串被代入新的句子中。
这里再说有关于字符串的几个方法
1,获取字符串长度的方法
1 animal="dog"
2
3 echo ${#animal}
输出结果:3 (这里不能用echo $#animal ,你可以测试一下,输出结果就不对喔,这样$#会代表 传递给脚本或函数的参数个数,所以会输出:0animal)
2,查找字符串
1 animal="dog, pig, cat, lion and so on"
2
3 echo `expr index "$animal" cat`
输出结果:11(注意这里第三行,expr 和 cat之后有特殊符号,该符号不是单引号,是Esc键下面那个)
shell注释
shell单行注释很简单,只需在每行行首增加#,用EOF分界符来多行注释,如下:
< ......//此段全被注释掉 EOF if判断语句 if ... then ... else if ... then ... fi fi 或者中间的else if ... fi 被换为elif 5 if [ $var == test1 ] 6 then 7 echo "1" 8 elif [ $var == test ] 9 then 10 echo "2" 11 fi 循环语句 1 #! /bin/sh 2 3 for (( i=0; i<10; i++)) 4 do echo $i 5 done 注意如下几点: 1,for循环要用双括号 括起来,即: ((...;...;...;)) 2,do 和 done是必不可少的 while循环 结构是: while ... do ... done 数组 了解一下shell数组 表示方式: 方式一:arraynum=(1 2 3 4 5) 方式二: arraynum[0]=0 arraynum[1]=1 arraynum[2]=2 获取数组的长度的方式:${#arraynum[@]} (arraynum[@]实际上arraynum的列表,计数符号我们在前面讲过,所以这个表达式不难理解) for in 语句 结构如下: for 变量名 in 列表 接着我们来看如何遍历输出数组 1 #! /bin/sh #!/bin/sh STRING= if [ -z "$STRING" ]; then if [ -n "$STRING" ]; then root@james-desktop:~# ./zerostring.sh ===========================================
do ...
done
2
3 arraynum[0]=a
4 arraynum[1]=b
5 arraynum[2]=c
6
7 for var in ${arraynum[@]}
8 do
9 echo ${var}
10 done
11
12 echo ${#arraynum[@]}
13 echo ${arraynum[@]}shell 字符串不为空
echo "STRING is empty"
fi
echo "STRING is not empty"
fi
STRING is emptychmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本