本文旨在记录Shell学习过程中的重点问题。
- #!告诉系统使用哪一种shell。例如
#!/bin/bash echo "Hello World !"
-
保存一个test.sh,cmd中cd到对应的目录,然后执行,
chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本
注意一定要写成./test.sh,而不是 test.sh,另外就是直接运行解释器。
/bin/sh test.sh /bin/php test.php
-
shell变量不加美元$符号,变量名和“=”号之间不能有空格,并且遵循常见的变量名命名规则(不能以数字开头,不能用关键字等)。
your_name="runoob.com"
-
直接在定义过的变量中添加"$"即可使用其变量。推荐都使用"{}"框起变量。
your_name="qinjx" echo $your_name echo ${your_name} #变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,推荐都使用{} #如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空) for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script" done
已定义的变量,可以重新被定义
your_name="tom" echo $your_name your_name="alibaba" echo $your_name
使用readonly 的变量的值不能被改变,为只读变量。
#!/bin/bash myUrl="https://www.google.com" readonly myUrl myUrl="https://www.runoob.com" # 会报错 NAME: This variable is read only.
使用unset命令可以删除变量。例 unset your_name; 注意,unset 不能删除只读变量。即 unset myUrl 是没有输出结果的,myUrl也不会被删除。
-
shell字符串可以使用单引号'',双引号"",也可以不使用引号。获取字符串长度使用 ${#变量名}
#单引号 str='this is a string' #单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的 #单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。 #双引号 your_name='runoob' str="Hello, I know you are \"$your_name\"! \n" echo -e $str # 输出 Hello, I know you are "runoob"! # 双引号里可以有变量 # 双引号里可以出现转义字符 #拼接字符串 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 #输出结果 #hello, runoob ! hello, runoob ! #hello, runoob ! hello, ${your_name} ! #获取字符串长度 string="abcd" echo ${#string} #输出 4
提取字符串
#从字符串第 2 个字符开始截取 5 个字符,注意截取从 0 开始数起 string="runoob is a great site" echo ${string:1:4} # 输出 unoo
查找字符串
#查找字符 i 或 o 的位置(哪个字母先出现就计算哪个): string="runoob is a great site" echo `expr index "$string" io` # 输出 4
-
shell数组。bash支持一维数组,数组元素从下标0开始。用()来表示数组
#数组名=(值1 值2 ... 值n) array_name=(value0 value1 value2 value3) #单独定义数组的各个分量 array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen
读取数组
#读取数组元素值的一般格式是: ${数组名[下标]} valuen=${array_name[n]} #使用 @ 符号可以获取数组中的所有元素 echo ${array_name[@]}
获取数组的长度,与获取字符串长度的方法相同
# 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]}
-
shell传递参数。脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推。其他比如$*,$@都是返回全部参数。
echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3"; #为脚本设置可执行权限,并执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 1 2 3 执行的文件名:./test.sh 第一个参数为:1 第二个参数为:2 第三个参数为:3
-
shell基本运算符。使用expr来进行计算。比如两个数相加
#!/bin/bash #注意使用的是反引号 ` 而不是单引号 ' val=`expr 2 + 2` echo "两数之和为 : $val" #输出 两数之和为 : 4 #注意:表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。 # 还有很多常见的运算符:-(减法),*(乘法),/(除法)等。
关系运算符。关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
-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。
布尔运算符
! 非运算,表达式为 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。
逻辑运算符
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false || 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
字符串运算符
运算符 说明 举例 = 检测两个字符串是否相等,相等返回 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。
文件测试运算符
-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。
-
printf命令。printf命令用法与C语言的基本一致。可以添加"%s","%c"等。注意:"%-10s" 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。比较简单,其余的查看其它博客。
-
test 命令。Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于则为真 -lt 小于则为真 -le 小于等于则为真 #举例 num1=100 num2=100 if test $[num1] -eq $[num2] then echo '两个数相等!' else echo '两个数不相等!' fi #输出 两个数相等!
字符串测试
参数 说明 = 等于则为真 != 不相等则为真 -z 字符串 字符串的长度为零则为真 -n 字符串 字符串的长度不为零则为真 #举例 num1="ru1noob" num2="runoob" if test $num1 = $num2 then echo '两个字符串相等!' else echo '两个字符串不相等!' fi #输出 两个字符串不相等!
文件测试
参数 说明 -e 文件名 如果文件存在则为真 -r 文件名 如果文件存在且可读则为真 -w 文件名 如果文件存在且可写则为真 -x 文件名 如果文件存在且可执行则为真 -s 文件名 如果文件存在且至少有一个字符则为真 -d 文件名 如果文件存在且为目录则为真 -f 文件名 如果文件存在且为普通文件则为真 -c 文件名 如果文件存在且为字符型特殊文件则为真 -b 文件名 如果文件存在且为块特殊文件则为真 #举例 cd /bin if test -e ./bash then echo '文件已存在!' else echo '文件不存在!' fi #输出 文件已存在! # Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。 cd /bin if test -e ./notFile -o -e ./bash then echo '至少有一个文件存在!' else echo '两个文件都不存在' fi #输出 至少有一个文件存在!