Shell 变量 1 chmod +x ./test.sh #使脚本具有执行权限
变量类型 运行shell时,会同时存在三种变量:
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
变量声明
1 2 3 4 # !/bin/bash my_name="Hello World !" echo $my_name echo ${my_name}
1 2 3 for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script" done
1 2 3 for file in `ls /etc` 或 for file in $(ls /etc)
只读变量 1 2 3 4 # !/bin/bash myUrl="https://www.google.com" readonly myUrl myUrl="https://www.runoob.com"
删除变量 1 2 3 4 # !/bin/sh myUrl="https://www.runoob.com" unset myUrl echo $myUrl
Shell 字符串 单引号
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号 1 2 3 your_name='runoob' str="Hello, I know you are \"$your_name\"! \n" echo -e $str
输出结果为:
1 Hello, I know you are "runoob"!
拼接字符串 1 2 3 4 5 6 7 8 9 your_name="runoob" # 使用双引号拼接 greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 # 使用单引号拼接 greeting_2='hello, '$your_name' !' greeting_3='hello, ${your_name} !' echo $greeting_2 $greeting_3
1 2 hello, runoob ! hello, runoob ! hello, runoob ! hello, ${your_name} !
提取子字符串 以下实例从字符串第 2 个字符开始截取 4 个字符:
1 2 string="runoob is a great site" echo ${string:1:4} # 输出 unoo
查找子字符串 查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
1 2 string="runoob is a great site" echo `expr index "$string" io` # 输出 4
Shell 数组 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
定义数组 在 Shell 中,用括号来表示数组,数组元素用”空格”符号分割开。定义数组的一般形式为:
例如:
1 array_name=(value0 value1 value2 value3)
或者
1 2 3 4 5 6 array_name=( value0 value1 value2 value3 )
还可以单独定义数组的各个分量:
1 2 3 array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen
可以不使用连续的下标,而且下标的范围没有限制。
读取数组 读取数组元素值的一般格式是:
例如:
使用 @ 符号可以获取数组中的所有元素,例如:
获取数组的长度 获取数组长度的方法与获取字符串长度的方法相同,例如:
1 2 3 4 5 6 # 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]}
Shell 传递参数 1 2 3 4 5 6 7 # !/bin/bash echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3";
另外,还有几个特殊字符用来处理参数:
参数处理
说明
$#
传递到脚本的参数个数
$*
以一个单字符串显示所有向脚本传递的参数。 如”$*”用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。
$$
脚本运行的当前进程ID号
$!
后台运行的最后一个进程的ID号
$@
与$*相同,但是使用时加引号,并在引号中返回每个参数。 如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。
$-
显示Shell使用的当前选项,与set命令 功能相同。
$?
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
1 2 3 4 5 6 7 8 9 10 # !/bin/bash echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3"; echo "参数个数:" $#; echo "参数内容:" $*; echo "脚本进程:" $$;
Shell 基本运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 \ `* 而不是单引号 *‘** ):
1 2 3 4 # !/bin/bash val=`expr 2 + 2` echo "两数之和为 : $val"
算术运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 算术运算符实例如下: 实例 # !/bin/bash a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a 等于 b" fi if [ $a != $b ] then echo "a 不等于 b" fi
关系运算符
运算符
说明
举例
-eq
检测两个数是否相等,相等返回 true。
[ $a -eq $b ] 返回 false。
-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。
布尔运算符 下表列出了常用的布尔运算符,假定变量 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。
逻辑运算符 以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符
说明
举例
&&
逻辑的 AND
[[ $a -lt 100 && $b -gt 100 ]] 返回 false
\
\
逻辑的 OR
[[ $a -lt 100 \
\
$b -gt 100 ]] 返回 true
字符串运算符 下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
运算符
说明
举例
=
检测两个字符串是否相等,相等返回 true。
[ $a = $b ] 返回 false。
!=
检测两个字符串是否不相等,不相等返回 true。
[ $a != $b ] 返回 true。
-z
检测字符串长度是否为0,为0返回 true。
[ -z $a ] 返回 false。
-n
检测字符串长度是否不为 0,不为 0 返回 true。
[ -n “$a” ] 返回 true。
$
检测字符串是否为空,不为空返回 true。
[ $a ] 返回 true。
文件测试运算符 文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符
说明
举例
-b file
检测文件是否是块设备文件,如果是,则返回 true。
[ -b $file ] 返回 false。
-c file
检测文件是否是字符设备文件,如果是,则返回 true。
[ -c $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。
其他检查符:
-S : 判断某文件是否 socket。
-L : 检测文件是否存在并且是一个符号链接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 # !/bin/bash file="/var/www/runoob/test.sh" if [ -r $file ] then echo "文件可读" else echo "文件不可读" fi if [ -w $file ] then echo "文件可写" else echo "文件不可写" fi if [ -x $file ] then echo "文件可执行" else echo "文件不可执行" fi if [ -f $file ] then echo "文件为普通文件" else echo "文件为特殊文件" fi if [ -d $file ] then echo "文件是个目录" else echo "文件不是个目录" fi if [ -s $file ] then echo "文件不为空" else echo "文件为空" fi if [ -e $file ] then echo "文件存在" else echo "文件不存在" fi
Shell echo命令 1.显示普通字符串:
2.显示转义字符
结果将是:
3.显示变量 read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
1 2 3 # !/bin/sh read name echo "$name It is a test"
以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:
1 2 3 [root@www ~]# sh test.sh OK #标准输入 OK It is a test #输出
4.显示换行 1 2 echo -e "OK! \n" # -e 开启转义 echo "It is a test"
输出结果:
5.显示不换行 1 2 3 # !/bin/sh echo -e "OK! \c" # -e 开启转义 \c 不换行 echo "It is a test"
输出结果:
6.显示结果定向至文件 1 echo "It is a test" > myfile
7.原样输出字符串,不进行转义或取变量(用单引号)
输出结果:
8.显示命令执行结果
注意: 这里使用的是反引号 ` , 而不是单引号 ‘ 。
结果将显示当前日期
1 Thu Jul 24 10:08:46 CST 2014
Shell printf 命令 printf 命令模仿 C 程序库(library)里的 printf() 程序。
printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
printf 命令的语法:
1 printf format-string [arguments...]
1 2 3 4 printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
Shell test 命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
数值测试
参数
说明
-eq
等于则为真
-ne
不等于则为真
-gt
大于则为真
-ge
大于等于则为真
-lt
小于则为真
-le
小于等于则为真
实例 1 2 3 4 5 6 7 8 num1=100 num2=100 if test $[num1] -eq $[num2]then echo '两个数相等!' else echo '两个数不相等!' fi
输出结果:
代码中的 [] 执行基本的算数运算,如:
实例 1 2 3 4 5 6 7 # !/bin/bash a=5 b=6 result=$[a+b] # 注意等号两边不能有空格 echo "result 为: $result"
结果为:
文件测试
参数
说明
-e 文件名
如果文件存在则为真
-r 文件名
如果文件存在且可读则为真
-w 文件名
如果文件存在且可写则为真
-x 文件名
如果文件存在且可执行则为真
-s 文件名
如果文件存在且至少有一个字符则为真
-d 文件名
如果文件存在且为目录则为真
-f 文件名
如果文件存在且为普通文件则为真
-c 文件名
如果文件存在且为字符型特殊文件则为真
-b 文件名
如果文件存在且为块特殊文件则为真
实例 1 2 3 4 5 6 7 cd /bin if test -e ./bash then echo '文件已存在!' else echo '文件不存在!' fi
输出结果:
另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如:
实例 1 2 3 4 5 6 7 cd /bin if test -e ./notFile -o -e ./bash then echo '至少有一个文件存在!' else echo '两个文件都不存在' fi
输出结果: