点击这里
来源于菜鸟网站的总结
1.开头和编译
1)开头
#!/bin/bash
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
2)编译
(1)作为可执行程序
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
(2)作为解释器参数(不用在第一行指定解释器信息)
sh test.sh //这个比较简单,方便,建议使用
2.变量
1)命名
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
2)使用
- 使用一个定义过的变量,只要在变量前加$符号
- 设置只读变量 readonly
3)删除
使用unset命令(不能删除只读变量)
3.字符串
单引号 双引号都可以,但是双引号可以有变量并且可以出现转义字符
1)拼接字符串
双引号和单引号都可以进行拼接
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} !
2)获取字符串长度
string="abcd"
echo ${#string} #输出 4
3)提取子字符串
string="runoob is a great site" // 这里是从下标为1的地方开始截取4个字符
cho ${string:1:4} # 输出 unoo
4)查找子字符串
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4 // 查找i或者o的位置,哪个先出现计算哪个
补充:Linux 的字符串截取很有用。有八种方法。
假设有变量 var=http://www.aaa.com/123.htm
#号截取,删除左边字符,保留右边字符。
echo ${var#*//}
其中 var 是变量名,# 号是运算符,// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm
2. ## 号截取,删除左边字符,保留右边字符。
echo ${var##*/}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/
结果是 123.htm
3. %号截取,删除右边字符,保留左边字符
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com
4. %% 号截取,删除右边字符,保留左边字符
echo ${var%%/*}
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:
5. 从左边第几个字符开始,及字符的个数
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
6. 从左边第几个字符开始,一直到结束。
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm
7. 从右边第几个字符开始,及字符的个数
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123
8. 从右边第几个字符开始,一直到结束。
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
4.数组
1) 定义
array_name=(value0 value1 value2 value3)
2)读取
valuen=${array_name[n]}
echo ${array_name[@]} //获取数组所有元素
3)获取数组长度
\# 取得数组元素的个数
length=${#array_name[@]}
\#或者
length=${#array_name[*]}
\# 取得数组单个元素的长度
lengthn=${#array_name[n]}
注释:可以给数组的元素传入变量,数组的下标也可以是变量
4)循环遍历数组:
#!/bin/bash
arr=(1 2 3 4 5 6 7 8 9 10)
for a in ${arr[*]}
do
echo $a
done
5)字符串转数组
#!/bin/bash
words="aaa bbb ccc"
#字符串转数组,空格是分隔符
array=(${words// / })
#打印数组最后一个成员
echo ${array[${#array[*]}-1]}
#打印数组长度
echo ${#array[*]}
#字符串不转换为数组,在循环实现以空格为分隔符打印每个成员
for word in ${words}; do
echo ${word}
done
5.注释
1)单行使用//或者*
2)多行
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
6.运算
注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
条件表达式要放在方括号之间,并且要有空格,例如: [
a
=
=
a==
a==b] 是错误的,必须写成 [ $a == $b ]。
乘号(*)前边必须加反斜杠()才能实现乘法运算;
1)算数运算符
2)关系运算符
3)布尔运算符
4)逻辑运算符
使用 [[ … ]] 条件判断结构,而不是 [ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、< 和 > 操作符能够正常存在于 [[ ]] 条件判断结构中,但是如果出现在 [ ] 结构中的话,会报错。
5)字符串运算符
字符串运算符比较时也可以用==
6)文件测试运算符
7.echo命令
读取变量用read
read命令接收参数,输入的词组个数大于需要的,多出的会被作为一个整体
参数说明:
- -p 输入提示文字
- -n 输入字符长度限制(达到6位,自动结束)
- -t 输入限时
- -s 隐藏输入内容
read -p "请输入一段文字:" -n 6 -t 5 -s password
$ sh test.sh
请输入一段文字:
password is asdfgh
#!/bin/sh
read name
echo "$name It is a test"
1)显示普通字符串
2)显示转义字符
3)显示变量
4)显示换行
echo -e "OK! \n" # -e 开启转义
echo "It is a test"
结果:
OK!
It is a test
5)显示不换行
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
结果:
OK! It is a test
6)显示结果定向至文件
echo "It is a test" > myfile
7)原样输出字符串,不转义(单引号)
8)显示命令结果
echo `date
8.printf 格式化输出
#format-string为双引号
printf "%d %s\n" 1 "abc"
10.test命令
用于检查某个条件是否成立,数值,字符和文件三个方面的测试
1)数值测试
格式:
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
2)字符串测试
格式
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
3)文件测试
格式
if test -e ./notFile -o -e ./bash
then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi
上面展示的是使用 -o(或) 逻辑操作符把两边的测试条件链接起来的情况
注意:如果if[ ];then 这种要连接在一起要用分号,如果不在一行,不需要加分号
11.流程控制
1)if-else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
2)for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
自己练习代码展示:
echo "Hello world!" // 第一行代码都是hello world开始的
array=(1 2 3 4)
echo first digit is ${array[0]}
echo "first digit is ${array[0]}" //实际上有没有分号是一样的
echo all digit are ${array[@]}
echo all digit are ${array[*]} // @和*都表示全部数组元素
echo "数组的长度为 ${#array[@]}" // 数组的长度
a=0
echo "第一个元素为:${array[a]}" //数组的下标可以是变量,其实数组的元素也可以是一个变量
for i in ${array[@]};
do
echo $i
done //试一下常用的for循环
:<<EOF //注释开头
val=`expr 2 + 2`
echo $val //运算要包括到expr中,这里不是一般的单引号,是反单引号,位于Esc下方
a=4
b=5
val1=`expr $a \* $b` // 还有其他的运算符都可以直接使用,但是称号一定要经过转义
echo $val1
if [ $a == $b ]
then echo a=b
else echo a not=b //if这不就出来了,判断条件装在[]里,结尾一定要有fi,一直忘记
fi
a=2
b=3
val=`expr $b / $a`
echo $val //结果是1,我想试一下这个除法是不是自动抹掉小数点之后的
str1="abc"
str2="cde"
if [ $str1 = $str2 ]
then
echo str1=str2
else
echo str1 not=str2
fi //字符串比较可以使用==也可以使用=
if [ -n "$str1" ]
then
echo lenngth is not 0
fi //判断字符串是不是不为0,这个使用时字符串要有引号
if [ $a ]
then
echo kong
else
echo not kong
fi
read n
echo n
echo -e "OK \n"
echo it
echo -e "OK \c"
echo it
read -p "please enter:" -n 6 -s passworld //-n是读的长度不超过6,-s是隐藏输入,-p是输入提示信息
echo -e "\npassworld is $passworld"
num1=100
num2=200
if test $num1 -eq $num2
then echo equal
else echo not equal
fi
str1="xuejiarui"
str2="denglun"
if test $str1 = $str2
then echo deng and xue are cp
else
echo deng and xue are cp2
fi //test的基础使用
if [ ! -d "xue" ]
then
touch xue
else
echo 文件xue已经存在
fi //判断文件存在
if [ -d xue ];
then
echo wenjiancunzai
else
echo 文件bucunzai
fi
a=10
b=20
if [ $a ==$b ]
then
echo 相等
elif [ $a -gt $b ]
then
echo a大于b
elif [ $a -lt $b ]
then
echo a小于b
else
echo 没有符合的条件 // if else结构使用
fi
EOF
string="ba ga ya lu"
for str in $string
do
echo $str
done